require(pRoloc)
Loading required package: pRoloc
Loading required package: MLInterfaces
Loading required package: annotate
Loading required package: AnnotationDbi
Loading required package: IRanges

Attaching package: 㤼㸱IRanges㤼㸲

The following object is masked from 㤼㸱package:grDevices㤼㸲:

    windows

Loading required package: XML

Attaching package: 㤼㸱annotate㤼㸲

The following object is masked from 㤼㸱package:mzR㤼㸲:

    nChrom

Loading required package: cluster
Loading required package: BiocParallel
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     

This is pRoloc version 1.28.0 
  Visit https://lgatto.github.io/pRoloc/ to get started.
require(pRolocdata)
Loading required package: pRolocdata

This is pRolocdata version 1.26.0.
Use 'pRolocdata()' to list available data sets.
setStockcol(paste0(getStockcol(), 90))
myBlues <- colorRampPalette(RColorBrewer::brewer.pal(9,"Blues"))(100)
set.seed(1)

#intial visualisation

fData(arabidposis_pbsrep1)$markers[fData(arabidposis_pbsrep1)$markers %in% c("cytosolic ribosomes", "extracellular")] <- "unknown"
plot2D(arabidposis_pbsrep1, grid = FALSE)
addLegend(arabidposis_pbsrep1, where = "topleft", cex = 0.7, ncol = 2)

lapply(out, plot)
[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

[[4]]
NULL

checking convergence

require(coda)
araprbsrep1diag <- gelman.diag(out[c(2,3,4)])
araprbsrep1diag
Potential scale reduction factors:

     Point est. Upper C.I.
[1,]      0.999          1
arab_psb_rep1_params_conv <- arab_psb_rep1_params[c(2,3,4)]
arab_psb_rep1_params_conv <- tagmMcmcProcess(arab_psb_rep1_params_conv)
arabidposis_pbsrep1 <- tagmPredict(object = arabidposis_pbsrep1, params = arab_psb_rep1_params_conv)
save(arab_psb_rep1_params_conv, file = "arab_psb_rep1_params_conv.rda")
save(arabidposis_pbsrep, file = "arabidposis_pbsrep_tagm.rda")
Error in save(arabidposis_pbsrep, file = "arabidposis_pbsrep_tagm.rda") : 
  object ‘arabidposis_pbsrep’ not found
par(mfrow = c(1, 2))
plot2D(arabidposis_pbsrep1, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_pbsrep1)$tagm.mcmc.probability,
        main = "TAGM MCMC allocations")
addLegend(arabidposis_pbsrep1, fcol = "markers",
           where = "topleft", ncol = 2, cex = 0.6)

plot2D(arabidposis_pbsrep1, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_pbsrep1)$tagm.mcmc.mean.shannon,
        main = "Visualising global uncertainty")
addLegend(arabidposis_pbsrep1, fcol = "markers",
           where = "topleft", ncol = 2, cex = 0.6)

load("C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/arabidposis_pbsrep1.rda")
arab_psb_rep1__markers2_params <- readRDS(file = "C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/mcmc_arabidposis_pbsrep1_markers2.rds")

#intial visualisation

fData(arabidposis_pbsrep1)$markers2[fData(arabidposis_pbsrep1)$markers2 %in% c("cytosolic ribosomes", "extracellular")] <- "unknown"
plot2D(arabidposis_pbsrep1, grid = FALSE, fcol = "markers2")
addLegend(arabidposis_pbsrep1, where = "topleft", cex = 0.7, ncol = 2, fcol = "markers2")

out <- mcmc_get_outliers(arab_psb_rep1__markers2_params)
nChains <- length(arab_psb_rep1__markers2_params)
nChains
[1] 4
for (i in seq_len(nChains))
    plot(out[[i]], main = paste("Chain", i), auto.layout = FALSE, col = i)

NA

gelman.diag(out, transform = FALSE)
Potential scale reduction factors:

     Point est. Upper C.I.
[1,]      0.999          1
arab_psb_rep1__markers2_params_pooled <- mcmc_pool_chains(arab_psb_rep1__markers2_params)
arab_psb_rep1__markers2_params_pooled
arab_psb_rep1__markers2_params_pooled <- tagmMcmcProcess(arab_psb_rep1__markers2_params_pooled)
arab_psb_rep1__markers2_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
Summary available
arabidposis_pbsrep1 <- tagmPredict(object = arabidposis_pbsrep1,
                           params = arab_psb_rep1__markers2_params_pooled,
                           probJoint = TRUE,
                           fcol = "markers2")
head(fData(arabidposis_pbsrep1))
NA
par(mfrow = c(1, 2))
plot2D(arabidposis_pbsrep1, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_pbsrep1)$tagm.mcmc.probability,
        main = "TAGM MCMC allocations")
addLegend(arabidposis_pbsrep1, fcol = "markers",
           where = "topleft", ncol = 2, cex = 0.6)

plot2D(arabidposis_pbsrep1, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_pbsrep1)$tagm.mcmc.mean.shannon,
        main = "Visualising global uncertainty")
addLegend(arabidposis_pbsrep1, fcol = "markers",
           where = "topleft", ncol = 2, cex = 0.6)

save(arab_psb_rep1__markers2_params_pooled, file = "arab_psb_rep1__markers2_params_pooled.rda")
Warning messages:
1: In readChar(file, size, TRUE) : truncating string with embedded nuls
2: In readChar(file, size, TRUE) : truncating string with embedded nuls
3: In readChar(file, size, TRUE) : truncating string with embedded nuls
4: In readChar(file, size, TRUE) : truncating string with embedded nuls
5: In readChar(file, size, TRUE) : truncating string with embedded nuls
6: In readChar(file, size, TRUE) : truncating string with embedded nuls
7: In readChar(file, size, TRUE) : truncating string with embedded nuls
8: In readChar(file, size, TRUE) : truncating string with embedded nuls
save(arabidposis_pbsrep1, file = "arabidposis_pbsrep1_markers_tagm.rda")
load("C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/arabidposis_pbsrep2.rda")
arab_psb_rep2_params <- readRDS(file = "C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/mcmc_arabidposis_pbsrep2.rds")

#intial visualisation

fData(arabidposis_pbsrep2)$markers[fData(arabidposis_pbsrep2)$markers %in% c("cytosolic ribosomes", "extracellular")] <- "unknown"
plot2D(arabidposis_pbsrep2, grid = FALSE, fcol = "markers")
addLegend(arabidposis_pbsrep2, where = "topleft", cex = 0.7, ncol = 2, fcol = "markers")

out <- mcmc_get_outliers(arab_psb_rep2_params)
nChains <- length(arab_psb_rep2_params)
nChains
[1] 4
for (i in seq_len(nChains))
    plot(out[[i]], main = paste("Chain", i), auto.layout = FALSE, col = i)

NA

gelman.diag(out[c(1,2,3)], transform = FALSE)
Potential scale reduction factors:

     Point est. Upper C.I.
[1,]      0.999          1
arab_psb_rep2_params_pooled <- mcmc_pool_chains(arab_psb_rep2_params[c(1,2,3)])
arab_psb_rep2_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
arab_psb_rep2_params_pooled <- tagmMcmcProcess(arab_psb_rep2_params_pooled)
arab_psb_rep2_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
Summary available
arabidposis_pbsrep2 <- tagmPredict(object = arabidposis_pbsrep2,
                           params = arab_psb_rep2_params_pooled,
                           probJoint = TRUE,
                           fcol = "markers")
head(fData(arabidposis_pbsrep2))
NA
par(mfrow = c(1, 2))
plot2D(arabidposis_pbsrep2, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_pbsrep2)$tagm.mcmc.probability,
        main = "TAGM MCMC allocations")
addLegend(arabidposis_pbsrep2, fcol = "markers",
           where = "topleft", ncol = 2, cex = 0.6)

plot2D(arabidposis_pbsrep2, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_pbsrep2)$tagm.mcmc.mean.shannon,
        main = "Visualising global uncertainty")
addLegend(arabidposis_pbsrep2, fcol = "markers",
           where = "topleft", ncol = 2, cex = 0.6)

save(arab_psb_rep2_params_pooled, file = "arab_psb_rep2_params_pooled.rda")
save(arabidposis_pbsrep2, file = "arabidposis_pbsrep2_tagm.rda")
load("C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/arabidposis_pbsrep2.rda")
Warning messages:
1: In readChar(file, size, TRUE) : truncating string with embedded nuls
2: In readChar(file, size, TRUE) : truncating string with embedded nuls
3: In readChar(file, size, TRUE) : truncating string with embedded nuls
4: In readChar(file, size, TRUE) : truncating string with embedded nuls
5: In readChar(file, size, TRUE) : truncating string with embedded nuls
6: In readChar(file, size, TRUE) : truncating string with embedded nuls
7: In readChar(file, size, TRUE) : truncating string with embedded nuls
8: In readChar(file, size, TRUE) : truncating string with embedded nuls
9: In readChar(file, size, TRUE) : truncating string with embedded nuls
arab_psb_rep2_params_markers2 <- readRDS(file = "C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/mcmc_arabidposis_pbsrep2_markers2.rds")

#intial visualisation

fData(arabidposis_pbsrep2)$markers2[fData(arabidposis_pbsrep2)$markers2 %in% c("cytosolic ribosomes", "extracellular")] <- "unknown"
plot2D(arabidposis_pbsrep2, grid = FALSE, fcol = "markers2")
addLegend(arabidposis_pbsrep2, where = "topleft", cex = 0.7, ncol = 2, fcol = "markers")

out <- mcmc_get_outliers(arab_psb_rep2_params_markers2)
nChains <- length(arab_psb_rep2_params_markers2)
nChains
[1] 4
for (i in seq_len(nChains))
    plot(out[[i]], main = paste("Chain", i), auto.layout = FALSE, col = i)

NA

gelman.diag(out[c(1,2,4)], transform = FALSE)
Potential scale reduction factors:

     Point est. Upper C.I.
[1,]       1.02       1.04
arab_psb_rep2_params_markers2_pooled <- mcmc_pool_chains(arab_psb_rep2_params_markers2[c(1,2,3)])
arab_psb_rep2_params_markers2_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
arab_psb_rep2_params_markers2_pooled <- tagmMcmcProcess(arab_psb_rep2_params_markers2_pooled)
arab_psb_rep2_params_markers2_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
Summary available
arabidposis_pbsrep2 <- tagmPredict(object = arabidposis_pbsrep2,
                           params = arab_psb_rep2_params_markers2_pooled,
                           probJoint = TRUE,
                           fcol = "markers2")
head(fData(arabidposis_pbsrep2))
NA
par(mfrow = c(1, 2))
plot2D(arabidposis_pbsrep2, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_pbsrep2)$tagm.mcmc.probability,
        main = "TAGM MCMC allocations")
addLegend(arabidposis_pbsrep2, fcol = "markers2",
           where = "topleft", ncol = 2, cex = 0.6)

plot2D(arabidposis_pbsrep2, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_pbsrep2)$tagm.mcmc.mean.shannon,
        main = "Visualising global uncertainty")
addLegend(arabidposis_pbsrep2, fcol = "markers2",
           where = "topleft", ncol = 2, cex = 0.6)

save(arab_psb_rep2_params_pooled, file = "arab_psb_rep2_params_markers2_pooled.rda")
save(arabidposis_pbsrep2, file = "arabidposis_pbsrep2_markers2_tagm.rda")

Pbs rep 3

load("C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/arabidposis_pbsrep3.rda")
arab_psb_rep3_params <- readRDS(file = "C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/mcmc_arabidposis_pbsrep3.rds")

#intial visualisation

fData(arabidposis_pbsrep3)$markers[fData(arabidposis_pbsrep3)$markers %in% c("cytosolic ribosomes", "extracellular")] <- "unknown"
plot2D(arabidposis_pbsrep3, grid = FALSE, fcol = "markers")
addLegend(arabidposis_pbsrep3, where = "topleft", cex = 0.7, ncol = 2, fcol = "markers")

out <- mcmc_get_outliers(arab_psb_rep3_params)
nChains <- length(arab_psb_rep3_params)
nChains
[1] 4
for (i in seq_len(nChains))
    plot(out[[i]], main = paste("Chain", i), auto.layout = FALSE, col = i)

NA

gelman.diag(out[c(2,3)], transform = FALSE)
Potential scale reduction factors:

     Point est. Upper C.I.
[1,]          1          1
arab_psb_rep3_params_pooled <- mcmc_pool_chains(arab_psb_rep3_params[c(2,3)])
arab_psb_rep3_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
arab_psb_rep3_params_pooled <- tagmMcmcProcess(arab_psb_rep3_params_pooled)
arab_psb_rep3_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
Summary available
arabidposis_pbsrep3 <- tagmPredict(object = arabidposis_pbsrep3,
                           params = arab_psb_rep3_params_pooled,
                           probJoint = TRUE,
                           fcol = "markers")
head(fData(arabidposis_pbsrep3))
NA
par(mfrow = c(1, 2))
plot2D(arabidposis_pbsrep3, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_pbsrep3)$tagm.mcmc.probability,
        main = "TAGM MCMC allocations")
addLegend(arabidposis_pbsrep3, fcol = "markers",
           where = "topleft", ncol = 2, cex = 0.6)

plot2D(arabidposis_pbsrep3, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_pbsrep3)$tagm.mcmc.mean.shannon,
        main = "Visualising global uncertainty")
addLegend(arabidposis_pbsrep3, fcol = "markers",
           where = "topleft", ncol = 2, cex = 0.6)

save(arab_psb_rep3_params_pooled, file = "arab_psb_rep3_params_pooled.rda")
save(arabidposis_pbsrep3, file = "arabidposis_pbsrep3_tagm.rda")

Pbs rep 3 markers 2

load("C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/arabidposis_pbsrep3.rda")
arab_psb_rep3_markers2_params <- readRDS(file = "C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/mcmc_arabidposis_pbsrep3_markers2.rds")

#intial visualisation

fData(arabidposis_pbsrep3)$markers2[fData(arabidposis_pbsrep3)$markers2 %in% c("cytosolic ribosomes", "extracellular")] <- "unknown"
plot2D(arabidposis_pbsrep3, grid = FALSE, fcol = "markers")
addLegend(arabidposis_pbsrep3, where = "topleft", cex = 0.7, ncol = 2, fcol = "markers2")

out <- mcmc_get_outliers(arab_psb_rep3_markers2_params)
nChains <- length(arab_psb_rep3_markers2_params)
nChains
[1] 4
for (i in seq_len(nChains))
    plot(out[[i]], main = paste("Chain", i), auto.layout = FALSE, col = i)

NA

gelman.diag(out[c(3,4)], transform = FALSE)
Potential scale reduction factors:

     Point est. Upper C.I.
[1,]      0.999      0.999
arab_psb_rep3_markers2_params_pooled <- mcmc_pool_chains(arab_psb_rep3_markers2_params[c(3,4)])
arab_psb_rep3_markers2_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
arab_psb_rep3_markers2_params_pooled <- tagmMcmcProcess(arab_psb_rep3_markers2_params_pooled)
arab_psb_rep3_markers2_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
Summary available
arabidposis_pbsrep3 <- tagmPredict(object = arabidposis_pbsrep3,
                           params = arab_psb_rep3_markers2_params_pooled,
                           probJoint = TRUE,
                           fcol = "markers2")
head(fData(arabidposis_pbsrep3))
NA
par(mfrow = c(1, 2))
plot2D(arabidposis_pbsrep3, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_pbsrep3)$tagm.mcmc.probability,
        main = "TAGM MCMC allocations")
addLegend(arabidposis_pbsrep3, fcol = "markers2",
           where = "topleft", ncol = 2, cex = 0.6)

plot2D(arabidposis_pbsrep3, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_pbsrep3)$tagm.mcmc.mean.shannon,
        main = "Visualising global uncertainty")
addLegend(arabidposis_pbsrep3, fcol = "markers2",
           where = "topleft", ncol = 2, cex = 0.6)

save(arab_psb_rep3_markers2_params_pooled, file = "arab_psb_rep3_markers2_params_pooled.rda")
save(arabidposis_pbsrep3, file = "arabidposis_pbsrep3_markers2_tagm.rda")

Pbs rep 4

load("C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/arabidposis_pbsrep4.rda")
arab_psb_rep4_params <- readRDS(file = "C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/mcmc_arabidposis_pbsrep4.rds")

#intial visualisation

fData(arabidposis_pbsrep4)$markers[fData(arabidposis_pbsrep4)$markers %in% c("cytosolic ribosomes", "extracellular")] <- "unknown"
plot2D(arabidposis_pbsrep4, grid = FALSE, fcol = "markers")
addLegend(arabidposis_pbsrep4, where = "topleft", cex = 0.7, ncol = 2, fcol = "markers")

out <- mcmc_get_outliers(arab_psb_rep4_params)
nChains <- length(arab_psb_rep4_params)
nChains
[1] 4
for (i in seq_len(nChains))
    plot(out[[i]], main = paste("Chain", i), auto.layout = FALSE, col = i)

NA

gelman.diag(out[c(1,2)], transform = FALSE)
Potential scale reduction factors:

     Point est. Upper C.I.
[1,]      0.999          1
arab_psb_rep4_params_pooled <- mcmc_pool_chains(arab_psb_rep4_params[c(1,2)])
arab_psb_rep4_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
arab_psb_rep4_params_pooled <- tagmMcmcProcess(arab_psb_rep4_params_pooled)
arab_psb_rep4_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
Summary available
arabidposis_pbsrep4 <- tagmPredict(object = arabidposis_pbsrep4,
                           params = arab_psb_rep4_params_pooled,
                           probJoint = TRUE,
                           fcol = "markers")
head(fData(arabidposis_pbsrep4))
NA
par(mfrow = c(1, 2))
plot2D(arabidposis_pbsrep4, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_pbsrep4)$tagm.mcmc.probability,
        main = "TAGM MCMC allocations")
addLegend(arabidposis_pbsrep4, fcol = "markers",
           where = "topleft", ncol = 2, cex = 0.6)

plot2D(arabidposis_pbsrep4, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_pbsrep4)$tagm.mcmc.mean.shannon,
        main = "Visualising global uncertainty")
addLegend(arabidposis_pbsrep4, fcol = "markers",
           where = "topleft", ncol = 2, cex = 0.6)

save(arab_psb_rep4_params_pooled, file = "arab_psb_rep4_pooled.rda")
save(arabidposis_pbsrep4, file = "arabidposis_pbsrep4_tagm.rda")

arabidopsis pbs rep 4 markers2

load("C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/arabidposis_pbsrep4.rda")
arab_psb_rep4_params_markers2 <- readRDS(file = "C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/mcmc_arabidposis_pbsrep4_markers2.rds")

#intial visualisation

fData(arabidposis_pbsrep4)$markers2[fData(arabidposis_pbsrep4)$markers2 %in% c("cytosolic ribosomes", "extracellular")] <- "unknown"
plot2D(arabidposis_pbsrep4, grid = FALSE, fcol = "markers2")
addLegend(arabidposis_pbsrep4, where = "topleft", cex = 0.7, ncol = 2, fcol = "markers2")

out <- mcmc_get_outliers(arab_psb_rep4_params_markers2)
nChains <- length(arab_psb_rep4_params_markers2)
nChains
[1] 4
for (i in seq_len(nChains))
    plot(out[[i]], main = paste("Chain", i), auto.layout = FALSE, col = i)

NA

gelman.diag(out[c(3,4)], transform = FALSE)
Potential scale reduction factors:

     Point est. Upper C.I.
[1,]          1       1.01
arab_psb_rep4_params_markers2_pooled <- mcmc_pool_chains(arab_psb_rep4_params_markers2[c(3,4)])
arab_psb_rep4_params_markers2_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
arab_psb_rep4_params_markers2_pooled <- tagmMcmcProcess(arab_psb_rep4_params_markers2_pooled)
arab_psb_rep4_params_markers2_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
Summary available
arabidposis_pbsrep4 <- tagmPredict(object = arabidposis_pbsrep4,
                           params = arab_psb_rep4_params_markers2_pooled,
                           probJoint = TRUE,
                           fcol = "markers2")
head(fData(arabidposis_pbsrep4))
NA
par(mfrow = c(1, 2))
plot2D(arabidposis_pbsrep4, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_pbsrep4)$tagm.mcmc.probability,
        main = "TAGM MCMC allocations")
addLegend(arabidposis_pbsrep4, fcol = "markers2",
           where = "topleft", ncol = 2, cex = 0.6)

plot2D(arabidposis_pbsrep4, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_pbsrep4)$tagm.mcmc.mean.shannon,
        main = "Visualising global uncertainty")
addLegend(arabidposis_pbsrep4, fcol = "markers2",
           where = "topleft", ncol = 2, cex = 0.6)

save(arab_psb_rep4_params_markers2_pooled, file = "arab_psb_rep4_params_markers2_pooled.rda")
save(arabidposis_pbsrep4, file = "arabidposis_pbsrep4_markers2_tagm.rda")

PBS combined replicates

load("C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/arabidposis_pbs.rda")
arab_psb_params <- readRDS(file = "C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/mcmc_arabidposis_pbs.rds")

#intial visualisation

fData(arabidposis_pbs)$markers[fData(arabidposis_pbs)$markers %in% c("cytosolic ribosomes", "extracellular")] <- "unknown"
plot2D(arabidposis_pbs, grid = FALSE, fcol = "markers")
addLegend(arabidposis_pbsrep4, where = "topleft", cex = 0.7, ncol = 2, fcol = "markers")

out <- mcmc_get_outliers(arab_psb_params)
nChains <- length(arab_psb_params)
nChains
[1] 4
for (i in seq_len(nChains))
    plot(out[[i]], main = paste("Chain", i), auto.layout = FALSE, col = i)

NA

gelman.diag(out[c(1,2,3,4)], transform = FALSE)
Potential scale reduction factors:

     Point est. Upper C.I.
[1,]       1.02       1.05
arab_psb_params_pooled <- mcmc_pool_chains(arab_psb_params[c(1,2,3,4)])
arab_psb_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
arab_psb_params_pooled <- tagmMcmcProcess(arab_psb_params_pooled)
arab_psb_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
Summary available
arabidposis_pbs <- tagmPredict(object = arabidposis_pbs,
                           params = arab_psb_params_pooled,
                           probJoint = TRUE,
                           fcol = "markers")
head(fData(arabidposis_pbs))
NA
par(mfrow = c(1, 2))
plot2D(arabidposis_pbs, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_pbs)$tagm.mcmc.probability,
        main = "TAGM MCMC allocations")
addLegend(arabidposis_pbsrep4, fcol = "markers",
           where = "topleft", ncol = 2, cex = 0.6)

plot2D(arabidposis_pbs, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_pbs)$tagm.mcmc.mean.shannon,
        main = "Visualising global uncertainty")
addLegend(arabidposis_pbsrep4, fcol = "markers",
           where = "topleft", ncol = 2, cex = 0.6)

save(arab_psb_params_pooled, file = "arab_psb_params_pooled.rda")
save(arabidposis_pbs, file = "arabidposis_pbs_tagm.rda")

Pbs combined markers2

load("C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/arabidposis_pbs.rda")
arab_psb_params_markers2 <- readRDS(file = "C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/mcmc_arabidposis_pbs_markers2.rds")

#intial visualisation

fData(arabidposis_pbs)$markers2[fData(arabidposis_pbs)$markers2 %in% c("cytosolic ribosomes", "extracellular")] <- "unknown"
plot2D(arabidposis_pbs, grid = FALSE, fcol = "markers2")
addLegend(arabidposis_pbsrep4, where = "topleft", cex = 0.7, ncol = 2, fcol = "markers2")

out <- mcmc_get_outliers(arab_psb_params_markers2)
nChains <- length(arab_psb_params_markers2)
nChains
[1] 4
for (i in seq_len(nChains))
    plot(out[[i]], main = paste("Chain", i), auto.layout = FALSE, col = i)

NA

gelman.diag(out[c(2,3)], transform = FALSE)
Potential scale reduction factors:

     Point est. Upper C.I.
[1,]       1.06       1.16
arab_psb_params_markers2_pooled <- mcmc_pool_chains(arab_psb_params_markers2[c(2,3)])
arab_psb_params_markers2_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
arab_psb_params_markers2_pooled <- tagmMcmcProcess(arab_psb_params_markers2_pooled)
arab_psb_params_markers2_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
Summary available
arabidposis_pbs <- tagmPredict(object = arabidposis_pbs,
                           params = arab_psb_params_markers2_pooled,
                           probJoint = TRUE,
                           fcol = "markers2")
head(fData(arabidposis_pbs))
NA
par(mfrow = c(1, 2))
plot2D(arabidposis_pbs, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_pbs)$tagm.mcmc.probability,
        main = "TAGM MCMC allocations")
addLegend(arabidposis_pbsrep4, fcol = "markers2",
           where = "topleft", ncol = 2, cex = 0.6)

plot2D(arabidposis_pbs, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_pbs)$tagm.mcmc.mean.shannon,
        main = "Visualising global uncertainty")
addLegend(arabidposis_pbsrep4, fcol = "markers2",
           where = "topleft", ncol = 2, cex = 0.6)

save(arab_psb_params_markers2_pooled, file = "arab_psb_params_markers2_pooled.rda")
save(arabidposis_pbs, file = "arabidposis_pbs_markers2_tagm.rda")

CO3 rep 1

load("C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/arabidposis_co3.rda")
arab_co3rep1_params <- readRDS(file = "C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/mcmc_arabidposis_co3rep1.rds")

#intial visualisation

fData(arabidposis_co3rep1)$markers[fData(arabidposis_co3rep1)$markers %in% c("cytosolic ribosomes", "extracellular")] <- "unknown"
plot2D(arabidposis_co3rep1, grid = FALSE, fcol = "markers")
addLegend(arabidposis_co3rep1, where = "topleft", cex = 0.7, ncol = 2, fcol = "markers")

out <- mcmc_get_outliers(arab_co3rep1_params)
nChains <- length(arab_co3rep1_params)
nChains
[1] 4
for (i in seq_len(nChains))
    plot(out[[i]], main = paste("Chain", i), auto.layout = FALSE, col = i)

NA

gelman.diag(out[c(2,3)], transform = FALSE)
Potential scale reduction factors:

     Point est. Upper C.I.
[1,]       1.01       1.04
arab_co3rep1_params_pooled <- mcmc_pool_chains(arab_co3rep1_params[c(2,3)])
arab_co3rep1_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
arab_co3rep1_params_pooled <- tagmMcmcProcess(arab_co3rep1_params_pooled)
arab_co3rep1_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
Summary available
arabidposis_co3rep1 <- tagmPredict(object = arabidposis_co3rep1,
                           params = arab_co3rep1_params_pooled,
                           probJoint = TRUE,
                           fcol = "markers")
head(fData(arabidposis_co3rep1))
NA
par(mfrow = c(1, 2))
plot2D(arabidposis_co3rep1, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_co3rep1)$tagm.mcmc.probability,
        main = "TAGM MCMC allocations")
addLegend(arabidposis_pbsrep4, fcol = "markers",
           where = "topleft", ncol = 2, cex = 0.6)

plot2D(arabidposis_co3rep1, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_co3rep1)$tagm.mcmc.mean.shannon,
        main = "Visualising global uncertainty")
addLegend(arabidposis_pbsrep4, fcol = "markers",
           where = "topleft", ncol = 2, cex = 0.6)

save(arab_co3rep1_params_pooled, file = "arab_co3rep1_params_pooled.rda")
save(arabidposis_co3rep1, file = "arabidposis_co3rep1_tagm.rda")

CO3 rep 1 marker2

load("C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/arabidposis_co3rep1.rda")
arab_co3rep1_marker2_params <- readRDS(file = "C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/mcmc_arabidposis_co3rep1_markers2.rds")

#intial visualisation

fData(arabidposis_co3rep1)$markers2[fData(arabidposis_co3rep1)$markers2 %in% c("cytosolic ribosomes", "extracellular")] <- "unknown"
plot2D(arabidposis_co3rep1, grid = FALSE, fcol = "markers2")
addLegend(arabidposis_co3rep1, where = "topleft", cex = 0.7, ncol = 2, fcol = "markers2")

out <- mcmc_get_outliers(arab_co3rep1_marker2_params)
nChains <- length(arab_co3rep1_marker2_params)
nChains
[1] 4
for (i in seq_len(nChains))
    plot(out[[i]], main = paste("Chain", i), auto.layout = FALSE, col = i)

NA

gelman.diag(out[c(2,3,4)], transform = FALSE)
Potential scale reduction factors:

     Point est. Upper C.I.
[1,]       1.02       1.05
arab_co3rep1_marker2_params_pooled <- mcmc_pool_chains(arab_co3rep1_marker2_params[c(2,3,4)])
arab_co3rep1_marker2_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
arab_co3rep1_marker2_params_pooled <- tagmMcmcProcess(arab_co3rep1_marker2_params_pooled)
arab_co3rep1_marker2_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
Summary available
arabidposis_co3rep1 <- tagmPredict(object = arabidposis_co3rep1,
                           params = arab_co3rep1_marker2_params_pooled,
                           probJoint = TRUE,
                           fcol = "markers2")
head(fData(arabidposis_co3rep1))
NA
par(mfrow = c(1, 2))
plot2D(arabidposis_co3rep1, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_co3rep1)$tagm.mcmc.probability,
        main = "TAGM MCMC allocations")
addLegend(arabidposis_co3rep1, fcol = "markers2",
           where = "topleft", ncol = 2, cex = 0.6)

plot2D(arabidposis_co3rep1, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_co3rep1)$tagm.mcmc.mean.shannon,
        main = "Visualising global uncertainty")
addLegend(arabidposis_co3rep1, fcol = "markers2",
           where = "topleft", ncol = 2, cex = 0.6)

save(arab_co3rep1_marker2_params_pooled, file = "arab_co3rep1_marker2_params_pooled.rda")
save(arabidposis_co3rep1, file = "arabidposis_co3rep1_markers2_tagm.rda")

co3 rep2

load("C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/arabidposis_co3rep2.rda")
arab_co3rep2_params <- readRDS(file = "C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/mcmc_arabidposis_co3rep2.rds")

#intial visualisation

fData(arabidposis_co3rep2)$markers[fData(arabidposis_co3rep2)$markers %in% c("cytosolic ribosomes", "extracellular")] <- "unknown"
plot2D(arabidposis_co3rep2, grid = FALSE, fcol = "markers")
addLegend(arabidposis_co3rep2, where = "topleft", cex = 0.7, ncol = 2, fcol = "markers")

out <- mcmc_get_outliers(arab_co3rep2_params)
nChains <- length(arab_co3rep2_params)
nChains
[1] 4
for (i in seq_len(nChains))
    plot(out[[i]], main = paste("Chain", i), auto.layout = FALSE, col = i)

NA

gelman.diag(out[c(1,2)], transform = FALSE)
Potential scale reduction factors:

     Point est. Upper C.I.
[1,]          1          1
arab_co3rep2_params_pooled <- mcmc_pool_chains(arab_co3rep2_params[c(1,2)])
arab_co3rep2_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
arab_co3rep2_params_pooled <- tagmMcmcProcess(arab_co3rep2_params_pooled)
arab_co3rep2_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
Summary available
arabidposis_co3rep2 <- tagmPredict(object = arabidposis_co3rep2,
                           params = arab_co3rep2_params_pooled,
                           probJoint = TRUE,
                           fcol = "markers")
head(fData(arabidposis_co3rep2))
NA
par(mfrow = c(1, 2))
plot2D(arabidposis_co3rep2, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_co3rep2)$tagm.mcmc.probability,
        main = "TAGM MCMC allocations")
addLegend(arabidposis_co3rep2, fcol = "markers",
           where = "topleft", ncol = 2, cex = 0.6)

plot2D(arabidposis_co3rep2, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_co3rep2)$tagm.mcmc.mean.shannon,
        main = "Visualising global uncertainty")
addLegend(arabidposis_co3rep2, fcol = "markers",
           where = "topleft", ncol = 2, cex = 0.6)

save(arab_co3rep2_params_pooled, file = "arab_co3rep2_params_pooled.rda")
save(arabidposis_co3rep2, file = "arabidposis_co3rep2_tagm.rda")

CO3 rep 2 markers2

load("C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/arabidposis_co3rep2.rda")
arab_co3rep2_markers2_params <- readRDS(file = "C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/mcmc_arabidposis_co3rep2_markers2.rds")

#intial visualisation

fData(arabidposis_co3rep2)$markers2[fData(arabidposis_co3rep2)$markers2 %in% c("cytosolic ribosomes", "extracellular")] <- "unknown"
plot2D(arabidposis_co3rep2, grid = FALSE, fcol = "markers2")
addLegend(arabidposis_co3rep2, where = "topleft", cex = 0.7, ncol = 2, fcol = "markers2")

out <- mcmc_get_outliers(arab_co3rep2_markers2_params)
nChains <- length(arab_co3rep2_markers2_params)
nChains
[1] 4
for (i in seq_len(nChains))
    plot(out[[i]], main = paste("Chain", i), auto.layout = FALSE, col = i)

NA

gelman.diag(out[c(2,3)], transform = FALSE)
Potential scale reduction factors:

     Point est. Upper C.I.
[1,]       1.04       1.12
arab_co3rep2_markers2_params_pooled <- mcmc_pool_chains(arab_co3rep2_markers2_params[c(2,3)])
arab_co3rep2_markers2_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
arab_co3rep2_markers2_params_pooled <- tagmMcmcProcess(arab_co3rep2_markers2_params_pooled)
arab_co3rep2_markers2_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
Summary available
arabidposis_co3rep2 <- tagmPredict(object = arabidposis_co3rep2,
                           params = arab_co3rep2_markers2_params_pooled,
                           probJoint = TRUE,
                           fcol = "markers2")
head(fData(arabidposis_co3rep2))
NA
par(mfrow = c(1, 2))
plot2D(arabidposis_co3rep2, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_co3rep2)$tagm.mcmc.probability,
        main = "TAGM MCMC allocations")
addLegend(arabidposis_co3rep2, fcol = "markers2",
           where = "topleft", ncol = 2, cex = 0.6)

plot2D(arabidposis_co3rep2, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_co3rep2)$tagm.mcmc.mean.shannon,
        main = "Visualising global uncertainty")
addLegend(arabidposis_co3rep2, fcol = "markers2",
           where = "topleft", ncol = 2, cex = 0.6)

save(arab_co3rep2_markers2_params_pooled, file = "arab_co3rep2_markers2_params_pooled.rda")
save(arabidposis_co3rep2, file = "arabidposis_co3rep2_markers2_tagm.rda")

CO3 rep 3

load("C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/arabidposis_co3rep3.rda")
arab_co3rep3_params <- readRDS(file = "C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/mcmc_arabidposis_co3rep3.rds")

#intial visualisation

fData(arabidposis_co3rep3)$markers[fData(arabidposis_co3rep3)$markers %in% c("cytosolic ribosomes", "extracellular")] <- "unknown"
plot2D(arabidposis_co3rep3, grid = FALSE, fcol = "markers")
addLegend(arabidposis_co3rep3, where = "topleft", cex = 0.7, ncol = 2, fcol = "markers")

out <- mcmc_get_outliers(arab_co3rep3_params)
nChains <- length(arab_co3rep3_params)
nChains
[1] 4
for (i in seq_len(nChains))
    plot(out[[i]], main = paste("Chain", i), auto.layout = FALSE, col = i)

NA

gelman.diag(out[c(2,3)], transform = FALSE)
Potential scale reduction factors:

     Point est. Upper C.I.
[1,]       1.01       1.04
arab_co3rep3_params_pooled <- mcmc_pool_chains(arab_co3rep3_params[c(2,3)])
arab_co3rep3_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
arab_co3rep3_params_pooled <- tagmMcmcProcess(arab_co3rep3_params_pooled)
arab_co3rep3_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
Summary available
arabidposis_co3rep3 <- tagmPredict(object = arabidposis_co3rep3,
                           params = arab_co3rep3_params_pooled,
                           probJoint = TRUE,
                           fcol = "markers")
head(fData(arabidposis_co3rep3))
NA
par(mfrow = c(1, 2))
plot2D(arabidposis_co3rep3, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_co3rep3)$tagm.mcmc.probability,
        main = "TAGM MCMC allocations")
addLegend(arabidposis_co3rep3, fcol = "markers",
           where = "topleft", ncol = 2, cex = 0.6)

plot2D(arabidposis_co3rep3, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_co3rep3)$tagm.mcmc.mean.shannon,
        main = "Visualising global uncertainty")
addLegend(arabidposis_co3rep2, fcol = "markers",
           where = "topleft", ncol = 2, cex = 0.6)

save(arab_co3rep3_params_pooled, file = "arab_co3rep3_params_pooled.rda")
save(arabidposis_co3rep3, file = "arabidposis_co3rep3_tagm.rda")

Co3 rep3 markers 2

load("C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/arabidposis_co3rep3.rda")
arab_co3rep3_markers2_params <- readRDS(file = "C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/mcmc_arabidposis_co3rep3_markers2.rds")

#intial visualisation

fData(arabidposis_co3rep3)$markers2[fData(arabidposis_co3rep3)$markers2 %in% c("cytosolic ribosomes", "extracellular")] <- "unknown"
plot2D(arabidposis_co3rep3, grid = FALSE, fcol = "markers2")
addLegend(arabidposis_co3rep3, where = "topleft", cex = 0.7, ncol = 2, fcol = "markers2")

out <- mcmc_get_outliers(arab_co3rep3_markers2_params)
nChains <- length(arab_co3rep3_markers2_params)
nChains
[1] 4
for (i in seq_len(nChains))
    plot(out[[i]], main = paste("Chain", i), auto.layout = FALSE, col = i)

NA

gelman.diag(out[c(2,3)], transform = FALSE)
Potential scale reduction factors:

     Point est. Upper C.I.
[1,]       1.01       1.03
arab_co3rep3_markers2_params_pooled <- mcmc_pool_chains(arab_co3rep3_markers2_params[c(2,3)])
arab_co3rep3_markers2_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
arab_co3rep3_markers2_params_pooled <- tagmMcmcProcess(arab_co3rep3_markers2_params_pooled)
arab_co3rep3_markers2_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
Summary available
arabidposis_co3rep3 <- tagmPredict(object = arabidposis_co3rep3,
                           params = arab_co3rep3_markers2_params_pooled,
                           probJoint = TRUE,
                           fcol = "markers2")
head(fData(arabidposis_co3rep3))
NA
par(mfrow = c(1, 2))
plot2D(arabidposis_co3rep3, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_co3rep3)$tagm.mcmc.probability,
        main = "TAGM MCMC allocations")
addLegend(arabidposis_co3rep3, fcol = "markers2",
           where = "topleft", ncol = 2, cex = 0.6)

plot2D(arabidposis_co3rep3, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_co3rep3)$tagm.mcmc.mean.shannon,
        main = "Visualising global uncertainty")
addLegend(arabidposis_co3rep2, fcol = "markers2",
           where = "topleft", ncol = 2, cex = 0.6)

save( arab_co3rep3_markers2_params_pooled, file = " arab_co3rep3_markers2_params_pooled.rda")
save(arabidposis_co3rep3, file = "arabidposis_co3rep3_markers2_tagm.rda")

co3 rep 4

load("C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/arabidposis_co3rep4.rda")
arab_co3rep4_params <- readRDS(file = "C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/mcmc_arabidposis_co3rep4.rds")

#intial visualisation

fData(arabidposis_co3rep4)$markers[fData(arabidposis_co3rep4)$markers %in% c("cytosolic ribosomes", "extracellular")] <- "unknown"
plot2D(arabidposis_co3rep4, grid = FALSE, fcol = "markers")
addLegend(arabidposis_co3rep4, where = "topleft", cex = 0.7, ncol = 2, fcol = "markers")

out <- mcmc_get_outliers(arab_co3rep4_params)
nChains <- length(arab_co3rep4_params)
nChains
[1] 4
for (i in seq_len(nChains))
    plot(out[[i]], main = paste("Chain", i), auto.layout = FALSE, col = i)

NA

gelman.diag(out[c(1,2)], transform = FALSE)
Potential scale reduction factors:

     Point est. Upper C.I.
[1,]      0.999          1
arab_co3rep4_params_pooled <- mcmc_pool_chains(arab_co3rep4_params[c(1,2)])
arab_co3rep4_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
arab_co3rep4_params_pooled <- tagmMcmcProcess(arab_co3rep4_params_pooled)
arab_co3rep4_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
Summary available
arabidposis_co3rep4 <- tagmPredict(object = arabidposis_co3rep4,
                           params = arab_co3rep4_params_pooled,
                           probJoint = TRUE,
                           fcol = "markers")
head(fData(arabidposis_co3rep4))
NA
par(mfrow = c(1, 2))
plot2D(arabidposis_co3rep4, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_co3rep4)$tagm.mcmc.probability,
        main = "TAGM MCMC allocations")
addLegend(arabidposis_co3rep4, fcol = "markers",
           where = "topleft", ncol = 2, cex = 0.6)

plot2D(arabidposis_co3rep4, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_co3rep4)$tagm.mcmc.mean.shannon,
        main = "Visualising global uncertainty")
addLegend(arabidposis_co3rep4, fcol = "markers",
           where = "topleft", ncol = 2, cex = 0.6)

save( arab_co3rep4_params_pooled, file = " arab_co3rep4_params_pooled.rda")
save(arabidposis_co3rep4, file = "arabidposis_co3rep4_tagm.rda")

Co3 rep 4 markers 2

load("C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/arabidposis_co3rep4.rda")
arab_co3rep4_markers2_params <- readRDS(file = "C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/mcmc_arabidposis_co3rep4_markers2.rds")

#intial visualisation

fData(arabidposis_co3rep4)$markers2[fData(arabidposis_co3rep4)$markers2 %in% c("cytosolic ribosomes", "extracellular")] <- "unknown"
plot2D(arabidposis_co3rep4, grid = FALSE, fcol = "markers2")
addLegend(arabidposis_co3rep4, where = "topleft", cex = 0.7, ncol = 2, fcol = "markers2")

out <- mcmc_get_outliers(arab_co3rep4_markers2_params)
nChains <- length(arab_co3rep4_markers2_params)
nChains
[1] 4
for (i in seq_len(nChains))
    plot(out[[i]], main = paste("Chain", i), auto.layout = FALSE, col = i)

NA

gelman.diag(out[c(2,3,4)], transform = FALSE)
Potential scale reduction factors:

     Point est. Upper C.I.
[1,]       1.01       1.04
arab_co3rep4_markers2_params_pooled <- mcmc_pool_chains(arab_co3rep4_markers2_params[c(2,3,4)])
arab_co3rep4_markers2_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
arab_co3rep4_markers2_params_pooled <- tagmMcmcProcess(arab_co3rep4_markers2_params_pooled)
arab_co3rep4_markers2_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
Summary available
arabidposis_co3rep4 <- tagmPredict(object = arabidposis_co3rep4,
                           params = arab_co3rep4_markers2_params_pooled,
                           probJoint = TRUE,
                           fcol = "markers2")
head(fData(arabidposis_co3rep4))
NA
par(mfrow = c(1, 2))
plot2D(arabidposis_co3rep4, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_co3rep4)$tagm.mcmc.probability,
        main = "TAGM MCMC allocations")
addLegend(arabidposis_co3rep4, fcol = "markers2",
           where = "topleft", ncol = 2, cex = 0.6)

plot2D(arabidposis_co3rep4, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_co3rep4)$tagm.mcmc.mean.shannon,
        main = "Visualising global uncertainty")
addLegend(arabidposis_co3rep4, fcol = "markers2",
           where = "topleft", ncol = 2, cex = 0.6)

save(arab_co3rep4_markers2_params_pooled, file = "arab_co3rep4_markers2_params_pooled.rda")
save(arabidposis_co3rep4, file = "arabidposis_co3rep4_markers2_tagm.rda")

Co3 combined reps

load("C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/arabidposis_co3rep4.rda")
arab_co3rep4_params <- readRDS(file = "C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/mcmc_arabidposis_co3rep4.rds")

#intial visualisation

fData(arabidposis_co3rep4)$markers[fData(arabidposis_co3rep4)$markers %in% c("cytosolic ribosomes", "extracellular")] <- "unknown"
plot2D(arabidposis_co3rep4, grid = FALSE, fcol = "markers")
addLegend(arabidposis_co3rep4, where = "topleft", cex = 0.7, ncol = 2, fcol = "markers")
out <- mcmc_get_outliers(arab_co3rep4_params)
nChains <- length(arab_co3rep4_params)
nChains
for (i in seq_len(nChains))
    plot(out[[i]], main = paste("Chain", i), auto.layout = FALSE, col = i)
gelman.diag(out[c(1,2)], transform = FALSE)
arab_co3rep4_params_pooled <- mcmc_pool_chains(arab_co3rep4_params[c(1,2)])
arab_co3rep4_params_pooled
arab_co3rep4_params_pooled <- tagmMcmcProcess(arab_co3rep4_params_pooled)
arab_co3rep4_params_pooled
arabidposis_co3rep4 <- tagmPredict(object = arabidposis_co3rep4,
                           params = arab_co3rep4_params_pooled,
                           probJoint = TRUE,
                           fcol = "markers")
head(fData(arabidposis_co3rep4))
par(mfrow = c(1, 2))
plot2D(arabidposis_co3rep4, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_co3rep4)$tagm.mcmc.probability,
        main = "TAGM MCMC allocations")
addLegend(arabidposis_co3rep4, fcol = "markers",
           where = "topleft", ncol = 2, cex = 0.6)

plot2D(arabidposis_co3rep4, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_co3rep4)$tagm.mcmc.mean.shannon,
        main = "Visualising global uncertainty")
addLegend(arabidposis_co3rep4, fcol = "markers",
           where = "topleft", ncol = 2, cex = 0.6)
save( arab_co3rep4_params_pooled, file = " arab_co3rep4_params_pooled.rda")
save(arabidposis_co3rep4, file = "arabidposis_co3rep4_tagm.rda")

Co3 combined

load("C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/arabidposis_co3.rda")
There were 50 or more warnings (use warnings() to see the first 50)
arab_co3_params <- readRDS(file = "C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/mcmc_arabidposis_co3.rds")

#intial visualisation

fData(arabidposis_co3)$markers[fData(arabidposis_co3)$markers %in% c("cytosolic ribosomes", "extracellular")] <- "unknown"
plot2D(arabidposis_co3, grid = FALSE, fcol = "markers")
addLegend(arabidposis_co3, where = "topleft", cex = 0.7, ncol = 2, fcol = "markers")

out <- mcmc_get_outliers(arab_co3_params)
nChains <- length(arab_co3_params)
nChains
[1] 4
for (i in seq_len(nChains))
    plot(out[[i]], main = paste("Chain", i), auto.layout = FALSE, col = i)

NA

gelman.diag(out[c(1,2,3,4)], transform = FALSE)
Potential scale reduction factors:

     Point est. Upper C.I.
[1,]          1          1
arab_co3_params_pooled <- mcmc_pool_chains(arab_co3_params[c(1,2,3,4)])
arab_co3_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
arab_co3_params_pooled <- tagmMcmcProcess(arab_co3_params_pooled)
arab_co3_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
Summary available
arabidposis_co3 <- tagmPredict(object = arabidposis_co3,
                           params = arab_co3_params_pooled,
                           probJoint = TRUE,
                           fcol = "markers")
head(fData(arabidposis_co3))
NA
par(mfrow = c(1, 2))
plot2D(arabidposis_co3, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_co3)$tagm.mcmc.probability,
        main = "TAGM MCMC allocations")
addLegend(arabidposis_co3, fcol = "markers",
           where = "topleft", ncol = 2, cex = 0.6)

plot2D(arabidposis_co3, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_co3)$tagm.mcmc.mean.shannon,
        main = "Visualising global uncertainty")
addLegend(arabidposis_co3, fcol = "markers",
           where = "topleft", ncol = 2, cex = 0.6)

save(arab_co3_params_pooled, file = "arab_co3_params_pooled.rda")
save(arabidposis_co3, file = "arabidposis_co3_tagm.rda")

#co3 rep4 markers 2

load("C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/arabidposis_co3rep4.rda")
arab_co3rep4_markers2_params <- readRDS(file = "C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/mcmc_arabidposis_co3rep4_markers2.rds")

#intial visualisation

fData(arabidposis_co3rep4)$markers2[fData(arabidposis_co3rep4)$markers2 %in% c("cytosolic ribosomes", "extracellular")] <- "unknown"
plot2D(arabidposis_co3rep4, grid = FALSE, fcol = "markers")
addLegend(arabidposis_co3, where = "topleft", cex = 0.7, ncol = 2, fcol = "markers2")

out <- mcmc_get_outliers(arab_co3rep4_markers2_params)
nChains <- length(arab_co3rep4_markers2_params)
nChains
[1] 4
for (i in seq_len(nChains))
    plot(out[[i]], main = paste("Chain", i), auto.layout = FALSE, col = i)

NA

gelman.diag(out[c(1,2,3,4)], transform = FALSE)
Potential scale reduction factors:

     Point est. Upper C.I.
[1,]       1.01       1.02
arab_co3rep4_markers2_params_pooled <- mcmc_pool_chains(arab_co3rep4_markers2_params[c(1,2,3,4)])
arab_co3rep4_markers2_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
arab_co3rep4_markers2_params_pooled  <- tagmMcmcProcess(arab_co3rep4_markers2_params_pooled )
arabidposis_co3rep4 <- tagmPredict(object = arabidposis_co3rep4,
                           params = arab_co3rep4_markers2_params_pooled,
                           probJoint = TRUE,
                           fcol = "markers2")
head(fData(arabidposis_co3rep4))
NA
par(mfrow = c(1, 2))
plot2D(arabidposis_co3rep4, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_co3rep4)$tagm.mcmc.probability,
        main = "TAGM MCMC allocations")
addLegend(arabidposis_co3, fcol = "markers2",
           where = "topleft", ncol = 2, cex = 0.6)

plot2D(arabidposis_co3rep4, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_co3rep4)$tagm.mcmc.mean.shannon,
        main = "Visualising global uncertainty")
addLegend(arabidposis_co3rep4, fcol = "markers2",
           where = "topleft", ncol = 2, cex = 0.6)

save(arab_co3rep4_markers2_params_pooled, file = "arab_co3rep4_markers2_params_pooled.rda")
save(arabidposis_co3rep4, file = "arabidposis_co3rep_markers2_tagm.rda")

co3 combined markers 2

load("C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/arabidposis_co3.rda")
arab_co3_markers2_params <- readRDS(file = "C:/Users/OllyC/Desktop/2019-LOPIT-Projects/2020-Harriet-Arabidopsis-/RawData/mcmc_arabidposis_co3_markers2.rds")

#intial visualisation

fData(arabidposis_co3)$markers2[fData(arabidposis_co3)$markers2 %in% c("cytosolic ribosomes", "extracellular")] <- "unknown"
plot2D(arabidposis_co3, grid = FALSE, fcol = "markers2")
addLegend(arabidposis_co3, where = "topleft", cex = 0.7, ncol = 2, fcol = "markers2")

out <- mcmc_get_outliers(arab_co3_markers2_params)
nChains <- length(arab_co3_markers2_params)
nChains
[1] 4
for (i in seq_len(nChains))
    plot(out[[i]], main = paste("Chain", i), auto.layout = FALSE, col = i)

NA

gelman.diag(out[c(1,2,3,4)], transform = FALSE)
Potential scale reduction factors:

     Point est. Upper C.I.
[1,]       1.01       1.02
arab_co3_markers2_params_pooled <- mcmc_pool_chains(arab_co3_markers2_params[c(1,2,3,4)])
There were 50 or more warnings (use warnings() to see the first 50)
arab_co3_markers2_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
arab_co3_markers2_params_pooled <- tagmMcmcProcess(arab_co3_markers2_params_pooled)
arab_co3_markers2_params_pooled
Object of class "MCMCParams"
Method: TAGM.MCMC 
Number of chains: 1 
Summary available
arabidposis_co3 <- tagmPredict(object = arabidposis_co3,
                           params = arab_co3_markers2_params_pooled,
                           probJoint = TRUE,
                           fcol = "markers2")
head(fData(arabidposis_co3))
NA
par(mfrow = c(1, 2))
plot2D(arabidposis_co3, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_co3)$tagm.mcmc.probability,
        main = "TAGM MCMC allocations")
addLegend(arabidposis_co3, fcol = "markers2",
           where = "topleft", ncol = 2, cex = 0.6)

plot2D(arabidposis_co3, fcol = "tagm.mcmc.allocation",
        cex = fData(arabidposis_co3)$tagm.mcmc.mean.shannon,
        main = "Visualising global uncertainty")
addLegend(arabidposis_co3, fcol = "markers2",
           where = "topleft", ncol = 2, cex = 0.6)

save(arab_co3_markers2_params_pooled, file = "arab_co3_markers2_params_pooled.rda")
save(arabidposis_co3, file = "arabidposis_co3_markers2_tagm.rda")
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7cix9DQpyZXF1aXJlKHBSb2xvYykNCnJlcXVpcmUocFJvbG9jZGF0YSkNCnNldFN0b2NrY29sKHBhc3RlMChnZXRTdG9ja2NvbCgpLCA5MCkpDQpteUJsdWVzIDwtIGNvbG9yUmFtcFBhbGV0dGUoUkNvbG9yQnJld2VyOjpicmV3ZXIucGFsKDksIkJsdWVzIikpKDEwMCkNCnNldC5zZWVkKDEpDQpgYGANCg0KYGBge3IsfQ0KbG9hZCgiQzovVXNlcnMvT2xseUMvRGVza3RvcC8yMDE5LUxPUElULVByb2plY3RzLzIwMjAtSGFycmlldC1BcmFiaWRvcHNpcy0vUmF3RGF0YS9hcmFiaWRwb3Npc19wYnNyZXAxLnJkYSIpDQphcmFiX3BzYl9yZXAxX3BhcmFtcyA8LSByZWFkUkRTKGZpbGUgPSAiQzovVXNlcnMvT2xseUMvRGVza3RvcC8yMDE5LUxPUElULVByb2plY3RzLzIwMjAtSGFycmlldC1BcmFiaWRvcHNpcy0vUmF3RGF0YS9tY21jX2FyYWJpZHBvc2lzX3Bic3JlcDEucmRzIikNCmBgYA0KDQojaW50aWFsIHZpc3VhbGlzYXRpb24NCmBgYHtyLH0NCmZEYXRhKGFyYWJpZHBvc2lzX3Bic3JlcDEpJG1hcmtlcnNbZkRhdGEoYXJhYmlkcG9zaXNfcGJzcmVwMSkkbWFya2VycyAlaW4lIGMoImN5dG9zb2xpYyByaWJvc29tZXMiLCAiZXh0cmFjZWxsdWxhciIpXSA8LSAidW5rbm93biINCnBsb3QyRChhcmFiaWRwb3Npc19wYnNyZXAxLCBncmlkID0gRkFMU0UpDQphZGRMZWdlbmQoYXJhYmlkcG9zaXNfcGJzcmVwMSwgd2hlcmUgPSAidG9wbGVmdCIsIGNleCA9IDAuNywgbmNvbCA9IDIpDQpgYGANCmBgYHtyLH0NCm91dCA8LSBtY21jX2dldF9vdXRsaWVycyhhcmFiX3BzYl9yZXAxX3BhcmFtcykNCmxhcHBseShvdXQsIHBsb3QpDQoNCmBgYA0KY2hlY2tpbmcgY29udmVyZ2VuY2UNCmBgYHtyLH0NCnJlcXVpcmUoY29kYSkNCmFyYXByYnNyZXAxZGlhZyA8LSBnZWxtYW4uZGlhZyhvdXRbYygyLDMsNCldKQ0KYXJhcHJic3JlcDFkaWFnDQphcmFiX3BzYl9yZXAxX3BhcmFtc19jb252IDwtIGFyYWJfcHNiX3JlcDFfcGFyYW1zW2MoMiwzLDQpXQ0KYGBgDQpgYGB7cix9DQphcmFiX3BzYl9yZXAxX3BhcmFtc19jb252IDwtIHRhZ21NY21jUHJvY2VzcyhhcmFiX3BzYl9yZXAxX3BhcmFtc19jb252KQ0KYXJhYmlkcG9zaXNfcGJzcmVwMSA8LSB0YWdtUHJlZGljdChvYmplY3QgPSBhcmFiaWRwb3Npc19wYnNyZXAxLCBwYXJhbXMgPSBhcmFiX3BzYl9yZXAxX3BhcmFtc19jb252KQ0KDQpgYGANCg0KYGBge3IsfQ0Kc2F2ZShhcmFiX3BzYl9yZXAxX3BhcmFtc19jb252LCBmaWxlID0gImFyYWJfcHNiX3JlcDFfcGFyYW1zX2NvbnYucmRhIikNCnNhdmUoYXJhYmlkcG9zaXNfcGJzcmVwMSwgZmlsZSA9ICJhcmFiaWRwb3Npc19wYnNyZXBfdGFnbS5yZGEiKQ0KYGBgDQoNCmBgYHtyLH0NCnBhcihtZnJvdyA9IGMoMSwgMikpDQpwbG90MkQoYXJhYmlkcG9zaXNfcGJzcmVwMSwgZmNvbCA9ICJ0YWdtLm1jbWMuYWxsb2NhdGlvbiIsDQogICAgICAgIGNleCA9IGV4cChmRGF0YShhcmFiaWRwb3Npc19wYnNyZXAxKSR0YWdtLm1jbWMucHJvYmFiaWxpdHkpIC0gMSwNCiAgICAgICAgbWFpbiA9ICJUQUdNIE1DTUMgYWxsb2NhdGlvbnMiKQ0KYWRkTGVnZW5kKGFyYWJpZHBvc2lzX3Bic3JlcDEsIGZjb2wgPSAibWFya2VycyIsDQogICAgICAgICAgIHdoZXJlID0gInRvcGxlZnQiLCBuY29sID0gMiwgY2V4ID0gMC42KQ0KDQpwbG90MkQoYXJhYmlkcG9zaXNfcGJzcmVwMSwgZmNvbCA9ICJ0YWdtLm1jbWMuYWxsb2NhdGlvbiIsDQogICAgICAgIGNleCA9IGZEYXRhKGFyYWJpZHBvc2lzX3Bic3JlcDEpJHRhZ20ubWNtYy5tZWFuLnNoYW5ub24sDQogICAgICAgIG1haW4gPSAiVmlzdWFsaXNpbmcgZ2xvYmFsIHVuY2VydGFpbnR5IikNCmFkZExlZ2VuZChhcmFiaWRwb3Npc19wYnNyZXAxLCBmY29sID0gIm1hcmtlcnMiLA0KICAgICAgICAgICB3aGVyZSA9ICJ0b3BsZWZ0IiwgbmNvbCA9IDIsIGNleCA9IDAuNikNCg0KYGBgDQpgYGB7cix9DQpsb2FkKCJDOi9Vc2Vycy9PbGx5Qy9EZXNrdG9wLzIwMTktTE9QSVQtUHJvamVjdHMvMjAyMC1IYXJyaWV0LUFyYWJpZG9wc2lzLS9SYXdEYXRhL2FyYWJpZHBvc2lzX3Bic3JlcDEucmRhIikNCmFyYWJfcHNiX3JlcDFfX21hcmtlcnMyX3BhcmFtcyA8LSByZWFkUkRTKGZpbGUgPSAiQzovVXNlcnMvT2xseUMvRGVza3RvcC8yMDE5LUxPUElULVByb2plY3RzLzIwMjAtSGFycmlldC1BcmFiaWRvcHNpcy0vUmF3RGF0YS9tY21jX2FyYWJpZHBvc2lzX3Bic3JlcDFfbWFya2VyczIucmRzIikNCmBgYA0KDQojaW50aWFsIHZpc3VhbGlzYXRpb24NCmBgYHtyLH0NCmZEYXRhKGFyYWJpZHBvc2lzX3Bic3JlcDEpJG1hcmtlcnMyW2ZEYXRhKGFyYWJpZHBvc2lzX3Bic3JlcDEpJG1hcmtlcnMyICVpbiUgYygiY3l0b3NvbGljIHJpYm9zb21lcyIsICJleHRyYWNlbGx1bGFyIildIDwtICJ1bmtub3duIg0KcGxvdDJEKGFyYWJpZHBvc2lzX3Bic3JlcDEsIGdyaWQgPSBGQUxTRSwgZmNvbCA9ICJtYXJrZXJzMiIpDQphZGRMZWdlbmQoYXJhYmlkcG9zaXNfcGJzcmVwMSwgd2hlcmUgPSAidG9wbGVmdCIsIGNleCA9IDAuNywgbmNvbCA9IDIsIGZjb2wgPSAibWFya2VyczIiKQ0KYGBgDQpgYGB7cix9DQpvdXQgPC0gbWNtY19nZXRfb3V0bGllcnMoYXJhYl9wc2JfcmVwMV9fbWFya2VyczJfcGFyYW1zKQ0KDQpgYGANCg0KDQpgYGB7cix9DQpuQ2hhaW5zIDwtIGxlbmd0aChhcmFiX3BzYl9yZXAxX19tYXJrZXJzMl9wYXJhbXMpDQpuQ2hhaW5zDQpmb3IgKGkgaW4gc2VxX2xlbihuQ2hhaW5zKSkNCiAgICBwbG90KG91dFtbaV1dLCBtYWluID0gcGFzdGUoIkNoYWluIiwgaSksIGF1dG8ubGF5b3V0ID0gRkFMU0UsIGNvbCA9IGkpDQoNCmBgYA0KYGBge3IsfQ0KZ2VsbWFuLmRpYWcob3V0LCB0cmFuc2Zvcm0gPSBGQUxTRSkNCg0KYGBgDQpgYGB7cix9DQphcmFiX3BzYl9yZXAxX19tYXJrZXJzMl9wYXJhbXNfcG9vbGVkIDwtIG1jbWNfcG9vbF9jaGFpbnMoYXJhYl9wc2JfcmVwMV9fbWFya2VyczJfcGFyYW1zKQ0KYXJhYl9wc2JfcmVwMV9fbWFya2VyczJfcGFyYW1zX3Bvb2xlZA0KDQpgYGANCg0KDQpgYGB7cix9DQphcmFiX3BzYl9yZXAxX19tYXJrZXJzMl9wYXJhbXNfcG9vbGVkIDwtIHRhZ21NY21jUHJvY2VzcyhhcmFiX3BzYl9yZXAxX19tYXJrZXJzMl9wYXJhbXNfcG9vbGVkKQ0KYXJhYl9wc2JfcmVwMV9fbWFya2VyczJfcGFyYW1zX3Bvb2xlZA0KDQpgYGANCg0KDQpgYGB7cix9DQphcmFiaWRwb3Npc19wYnNyZXAxIDwtIHRhZ21QcmVkaWN0KG9iamVjdCA9IGFyYWJpZHBvc2lzX3Bic3JlcDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSBhcmFiX3BzYl9yZXAxX19tYXJrZXJzMl9wYXJhbXNfcG9vbGVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYkpvaW50ID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZjb2wgPSAibWFya2VyczIiKQ0KaGVhZChmRGF0YShhcmFiaWRwb3Npc19wYnNyZXAxKSkNCg0KYGBgDQoNCmBgYHtyLH0NCnBhcihtZnJvdyA9IGMoMSwgMikpDQpwbG90MkQoYXJhYmlkcG9zaXNfcGJzcmVwMSwgZmNvbCA9ICJ0YWdtLm1jbWMuYWxsb2NhdGlvbiIsDQogICAgICAgIGNleCA9IGZEYXRhKGFyYWJpZHBvc2lzX3Bic3JlcDEpJHRhZ20ubWNtYy5wcm9iYWJpbGl0eSwNCiAgICAgICAgbWFpbiA9ICJUQUdNIE1DTUMgYWxsb2NhdGlvbnMiKQ0KYWRkTGVnZW5kKGFyYWJpZHBvc2lzX3Bic3JlcDEsIGZjb2wgPSAibWFya2VycyIsDQogICAgICAgICAgIHdoZXJlID0gInRvcGxlZnQiLCBuY29sID0gMiwgY2V4ID0gMC42KQ0KDQpwbG90MkQoYXJhYmlkcG9zaXNfcGJzcmVwMSwgZmNvbCA9ICJ0YWdtLm1jbWMuYWxsb2NhdGlvbiIsDQogICAgICAgIGNleCA9IGZEYXRhKGFyYWJpZHBvc2lzX3Bic3JlcDEpJHRhZ20ubWNtYy5tZWFuLnNoYW5ub24sDQogICAgICAgIG1haW4gPSAiVmlzdWFsaXNpbmcgZ2xvYmFsIHVuY2VydGFpbnR5IikNCmFkZExlZ2VuZChhcmFiaWRwb3Npc19wYnNyZXAxLCBmY29sID0gIm1hcmtlcnMiLA0KICAgICAgICAgICB3aGVyZSA9ICJ0b3BsZWZ0IiwgbmNvbCA9IDIsIGNleCA9IDAuNikNCg0KYGBgDQoNCmBgYHtyLH0NCnNhdmUoYXJhYl9wc2JfcmVwMV9fbWFya2VyczJfcGFyYW1zX3Bvb2xlZCwgZmlsZSA9ICJhcmFiX3BzYl9yZXAxX19tYXJrZXJzMl9wYXJhbXNfcG9vbGVkLnJkYSIpDQpzYXZlKGFyYWJpZHBvc2lzX3Bic3JlcDEsIGZpbGUgPSAiYXJhYmlkcG9zaXNfcGJzcmVwMV9tYXJrZXJzX3RhZ20ucmRhIikNCmBgYA0KDQoNCmBgYHtyLH0NCmxvYWQoIkM6L1VzZXJzL09sbHlDL0Rlc2t0b3AvMjAxOS1MT1BJVC1Qcm9qZWN0cy8yMDIwLUhhcnJpZXQtQXJhYmlkb3BzaXMtL1Jhd0RhdGEvYXJhYmlkcG9zaXNfcGJzcmVwMi5yZGEiKQ0KYXJhYl9wc2JfcmVwMl9wYXJhbXMgPC0gcmVhZFJEUyhmaWxlID0gIkM6L1VzZXJzL09sbHlDL0Rlc2t0b3AvMjAxOS1MT1BJVC1Qcm9qZWN0cy8yMDIwLUhhcnJpZXQtQXJhYmlkb3BzaXMtL1Jhd0RhdGEvbWNtY19hcmFiaWRwb3Npc19wYnNyZXAyLnJkcyIpDQpgYGANCg0KI2ludGlhbCB2aXN1YWxpc2F0aW9uDQpgYGB7cix9DQpmRGF0YShhcmFiaWRwb3Npc19wYnNyZXAyKSRtYXJrZXJzW2ZEYXRhKGFyYWJpZHBvc2lzX3Bic3JlcDIpJG1hcmtlcnMgJWluJSBjKCJjeXRvc29saWMgcmlib3NvbWVzIiwgImV4dHJhY2VsbHVsYXIiKV0gPC0gInVua25vd24iDQpwbG90MkQoYXJhYmlkcG9zaXNfcGJzcmVwMiwgZ3JpZCA9IEZBTFNFLCBmY29sID0gIm1hcmtlcnMiKQ0KYWRkTGVnZW5kKGFyYWJpZHBvc2lzX3Bic3JlcDIsIHdoZXJlID0gInRvcGxlZnQiLCBjZXggPSAwLjcsIG5jb2wgPSAyLCBmY29sID0gIm1hcmtlcnMiKQ0KYGBgDQpgYGB7cix9DQpvdXQgPC0gbWNtY19nZXRfb3V0bGllcnMoYXJhYl9wc2JfcmVwMl9wYXJhbXMpDQoNCmBgYA0KDQoNCmBgYHtyLH0NCm5DaGFpbnMgPC0gbGVuZ3RoKGFyYWJfcHNiX3JlcDJfcGFyYW1zKQ0KbkNoYWlucw0KZm9yIChpIGluIHNlcV9sZW4obkNoYWlucykpDQogICAgcGxvdChvdXRbW2ldXSwgbWFpbiA9IHBhc3RlKCJDaGFpbiIsIGkpLCBhdXRvLmxheW91dCA9IEZBTFNFLCBjb2wgPSBpKQ0KDQpgYGANCmBgYHtyLH0NCmdlbG1hbi5kaWFnKG91dFtjKDEsMiwzKV0sIHRyYW5zZm9ybSA9IEZBTFNFKQ0KDQpgYGANCmBgYHtyLH0NCmFyYWJfcHNiX3JlcDJfcGFyYW1zX3Bvb2xlZCA8LSBtY21jX3Bvb2xfY2hhaW5zKGFyYWJfcHNiX3JlcDJfcGFyYW1zW2MoMSwyLDMpXSkNCmFyYWJfcHNiX3JlcDJfcGFyYW1zX3Bvb2xlZA0KDQpgYGANCg0KDQpgYGB7cix9DQphcmFiX3BzYl9yZXAyX3BhcmFtc19wb29sZWQgPC0gdGFnbU1jbWNQcm9jZXNzKGFyYWJfcHNiX3JlcDJfcGFyYW1zX3Bvb2xlZCkNCmFyYWJfcHNiX3JlcDJfcGFyYW1zX3Bvb2xlZA0KDQpgYGANCg0KDQpgYGB7cix9DQphcmFiaWRwb3Npc19wYnNyZXAyIDwtIHRhZ21QcmVkaWN0KG9iamVjdCA9IGFyYWJpZHBvc2lzX3Bic3JlcDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSBhcmFiX3BzYl9yZXAyX3BhcmFtc19wb29sZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iSm9pbnQgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNvbCA9ICJtYXJrZXJzIikNCmhlYWQoZkRhdGEoYXJhYmlkcG9zaXNfcGJzcmVwMikpDQoNCmBgYA0KDQpgYGB7cix9DQpwYXIobWZyb3cgPSBjKDEsIDIpKQ0KcGxvdDJEKGFyYWJpZHBvc2lzX3Bic3JlcDIsIGZjb2wgPSAidGFnbS5tY21jLmFsbG9jYXRpb24iLA0KICAgICAgICBjZXggPSBmRGF0YShhcmFiaWRwb3Npc19wYnNyZXAyKSR0YWdtLm1jbWMucHJvYmFiaWxpdHksDQogICAgICAgIG1haW4gPSAiVEFHTSBNQ01DIGFsbG9jYXRpb25zIikNCmFkZExlZ2VuZChhcmFiaWRwb3Npc19wYnNyZXAyLCBmY29sID0gIm1hcmtlcnMiLA0KICAgICAgICAgICB3aGVyZSA9ICJ0b3BsZWZ0IiwgbmNvbCA9IDIsIGNleCA9IDAuNikNCg0KcGxvdDJEKGFyYWJpZHBvc2lzX3Bic3JlcDIsIGZjb2wgPSAidGFnbS5tY21jLmFsbG9jYXRpb24iLA0KICAgICAgICBjZXggPSBmRGF0YShhcmFiaWRwb3Npc19wYnNyZXAyKSR0YWdtLm1jbWMubWVhbi5zaGFubm9uLA0KICAgICAgICBtYWluID0gIlZpc3VhbGlzaW5nIGdsb2JhbCB1bmNlcnRhaW50eSIpDQphZGRMZWdlbmQoYXJhYmlkcG9zaXNfcGJzcmVwMiwgZmNvbCA9ICJtYXJrZXJzIiwNCiAgICAgICAgICAgd2hlcmUgPSAidG9wbGVmdCIsIG5jb2wgPSAyLCBjZXggPSAwLjYpDQoNCmBgYA0KDQpgYGB7cix9DQpzYXZlKGFyYWJfcHNiX3JlcDJfcGFyYW1zX3Bvb2xlZCwgZmlsZSA9ICJhcmFiX3BzYl9yZXAyX3BhcmFtc19wb29sZWQucmRhIikNCnNhdmUoYXJhYmlkcG9zaXNfcGJzcmVwMiwgZmlsZSA9ICJhcmFiaWRwb3Npc19wYnNyZXAyX3RhZ20ucmRhIikNCmBgYA0KDQpgYGB7cix9DQpsb2FkKCJDOi9Vc2Vycy9PbGx5Qy9EZXNrdG9wLzIwMTktTE9QSVQtUHJvamVjdHMvMjAyMC1IYXJyaWV0LUFyYWJpZG9wc2lzLS9SYXdEYXRhL2FyYWJpZHBvc2lzX3Bic3JlcDIucmRhIikNCmFyYWJfcHNiX3JlcDJfcGFyYW1zX21hcmtlcnMyIDwtIHJlYWRSRFMoZmlsZSA9ICJDOi9Vc2Vycy9PbGx5Qy9EZXNrdG9wLzIwMTktTE9QSVQtUHJvamVjdHMvMjAyMC1IYXJyaWV0LUFyYWJpZG9wc2lzLS9SYXdEYXRhL21jbWNfYXJhYmlkcG9zaXNfcGJzcmVwMl9tYXJrZXJzMi5yZHMiKQ0KYGBgDQoNCiNpbnRpYWwgdmlzdWFsaXNhdGlvbg0KYGBge3IsfQ0KZkRhdGEoYXJhYmlkcG9zaXNfcGJzcmVwMikkbWFya2VyczJbZkRhdGEoYXJhYmlkcG9zaXNfcGJzcmVwMikkbWFya2VyczIgJWluJSBjKCJjeXRvc29saWMgcmlib3NvbWVzIiwgImV4dHJhY2VsbHVsYXIiKV0gPC0gInVua25vd24iDQpwbG90MkQoYXJhYmlkcG9zaXNfcGJzcmVwMiwgZ3JpZCA9IEZBTFNFLCBmY29sID0gIm1hcmtlcnMyIikNCmFkZExlZ2VuZChhcmFiaWRwb3Npc19wYnNyZXAyLCB3aGVyZSA9ICJ0b3BsZWZ0IiwgY2V4ID0gMC43LCBuY29sID0gMiwgZmNvbCA9ICJtYXJrZXJzIikNCmBgYA0KYGBge3IsfQ0Kb3V0IDwtIG1jbWNfZ2V0X291dGxpZXJzKGFyYWJfcHNiX3JlcDJfcGFyYW1zX21hcmtlcnMyKQ0KDQpgYGANCg0KDQpgYGB7cix9DQpuQ2hhaW5zIDwtIGxlbmd0aChhcmFiX3BzYl9yZXAyX3BhcmFtc19tYXJrZXJzMikNCm5DaGFpbnMNCmZvciAoaSBpbiBzZXFfbGVuKG5DaGFpbnMpKQ0KICAgIHBsb3Qob3V0W1tpXV0sIG1haW4gPSBwYXN0ZSgiQ2hhaW4iLCBpKSwgYXV0by5sYXlvdXQgPSBGQUxTRSwgY29sID0gaSkNCg0KYGBgDQpgYGB7cix9DQpnZWxtYW4uZGlhZyhvdXRbYygxLDIsNCldLCB0cmFuc2Zvcm0gPSBGQUxTRSkNCg0KYGBgDQpgYGB7cix9DQphcmFiX3BzYl9yZXAyX3BhcmFtc19tYXJrZXJzMl9wb29sZWQgPC0gbWNtY19wb29sX2NoYWlucyhhcmFiX3BzYl9yZXAyX3BhcmFtc19tYXJrZXJzMltjKDEsMiwzKV0pDQphcmFiX3BzYl9yZXAyX3BhcmFtc19tYXJrZXJzMl9wb29sZWQNCg0KYGBgDQoNCg0KYGBge3IsfQ0KYXJhYl9wc2JfcmVwMl9wYXJhbXNfbWFya2VyczJfcG9vbGVkIDwtIHRhZ21NY21jUHJvY2VzcyhhcmFiX3BzYl9yZXAyX3BhcmFtc19tYXJrZXJzMl9wb29sZWQpDQphcmFiX3BzYl9yZXAyX3BhcmFtc19tYXJrZXJzMl9wb29sZWQNCg0KYGBgDQoNCg0KYGBge3IsfQ0KYXJhYmlkcG9zaXNfcGJzcmVwMiA8LSB0YWdtUHJlZGljdChvYmplY3QgPSBhcmFiaWRwb3Npc19wYnNyZXAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gYXJhYl9wc2JfcmVwMl9wYXJhbXNfbWFya2VyczJfcG9vbGVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYkpvaW50ID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZjb2wgPSAibWFya2VyczIiKQ0KaGVhZChmRGF0YShhcmFiaWRwb3Npc19wYnNyZXAyKSkNCg0KYGBgDQoNCmBgYHtyLH0NCnBhcihtZnJvdyA9IGMoMSwgMikpDQpwbG90MkQoYXJhYmlkcG9zaXNfcGJzcmVwMiwgZmNvbCA9ICJ0YWdtLm1jbWMuYWxsb2NhdGlvbiIsDQogICAgICAgIGNleCA9IGZEYXRhKGFyYWJpZHBvc2lzX3Bic3JlcDIpJHRhZ20ubWNtYy5wcm9iYWJpbGl0eSwNCiAgICAgICAgbWFpbiA9ICJUQUdNIE1DTUMgYWxsb2NhdGlvbnMiKQ0KYWRkTGVnZW5kKGFyYWJpZHBvc2lzX3Bic3JlcDIsIGZjb2wgPSAibWFya2VyczIiLA0KICAgICAgICAgICB3aGVyZSA9ICJ0b3BsZWZ0IiwgbmNvbCA9IDIsIGNleCA9IDAuNikNCg0KcGxvdDJEKGFyYWJpZHBvc2lzX3Bic3JlcDIsIGZjb2wgPSAidGFnbS5tY21jLmFsbG9jYXRpb24iLA0KICAgICAgICBjZXggPSBmRGF0YShhcmFiaWRwb3Npc19wYnNyZXAyKSR0YWdtLm1jbWMubWVhbi5zaGFubm9uLA0KICAgICAgICBtYWluID0gIlZpc3VhbGlzaW5nIGdsb2JhbCB1bmNlcnRhaW50eSIpDQphZGRMZWdlbmQoYXJhYmlkcG9zaXNfcGJzcmVwMiwgZmNvbCA9ICJtYXJrZXJzMiIsDQogICAgICAgICAgIHdoZXJlID0gInRvcGxlZnQiLCBuY29sID0gMiwgY2V4ID0gMC42KQ0KDQpgYGANCg0KYGBge3IsfQ0Kc2F2ZShhcmFiX3BzYl9yZXAyX3BhcmFtc19wb29sZWQsIGZpbGUgPSAiYXJhYl9wc2JfcmVwMl9wYXJhbXNfbWFya2VyczJfcG9vbGVkLnJkYSIpDQpzYXZlKGFyYWJpZHBvc2lzX3Bic3JlcDIsIGZpbGUgPSAiYXJhYmlkcG9zaXNfcGJzcmVwMl9tYXJrZXJzMl90YWdtLnJkYSIpDQpgYGANCg0KIyBQYnMgcmVwIDMNCg0KDQpgYGB7cix9DQpsb2FkKCJDOi9Vc2Vycy9PbGx5Qy9EZXNrdG9wLzIwMTktTE9QSVQtUHJvamVjdHMvMjAyMC1IYXJyaWV0LUFyYWJpZG9wc2lzLS9SYXdEYXRhL2FyYWJpZHBvc2lzX3Bic3JlcDMucmRhIikNCmFyYWJfcHNiX3JlcDNfcGFyYW1zIDwtIHJlYWRSRFMoZmlsZSA9ICJDOi9Vc2Vycy9PbGx5Qy9EZXNrdG9wLzIwMTktTE9QSVQtUHJvamVjdHMvMjAyMC1IYXJyaWV0LUFyYWJpZG9wc2lzLS9SYXdEYXRhL21jbWNfYXJhYmlkcG9zaXNfcGJzcmVwMy5yZHMiKQ0KYGBgDQoNCiNpbnRpYWwgdmlzdWFsaXNhdGlvbg0KYGBge3IsfQ0KZkRhdGEoYXJhYmlkcG9zaXNfcGJzcmVwMykkbWFya2Vyc1tmRGF0YShhcmFiaWRwb3Npc19wYnNyZXAzKSRtYXJrZXJzICVpbiUgYygiY3l0b3NvbGljIHJpYm9zb21lcyIsICJleHRyYWNlbGx1bGFyIildIDwtICJ1bmtub3duIg0KcGxvdDJEKGFyYWJpZHBvc2lzX3Bic3JlcDMsIGdyaWQgPSBGQUxTRSwgZmNvbCA9ICJtYXJrZXJzIikNCmFkZExlZ2VuZChhcmFiaWRwb3Npc19wYnNyZXAzLCB3aGVyZSA9ICJ0b3BsZWZ0IiwgY2V4ID0gMC43LCBuY29sID0gMiwgZmNvbCA9ICJtYXJrZXJzIikNCmBgYA0KYGBge3IsfQ0Kb3V0IDwtIG1jbWNfZ2V0X291dGxpZXJzKGFyYWJfcHNiX3JlcDNfcGFyYW1zKQ0KDQpgYGANCg0KDQpgYGB7cix9DQpuQ2hhaW5zIDwtIGxlbmd0aChhcmFiX3BzYl9yZXAzX3BhcmFtcykNCm5DaGFpbnMNCmZvciAoaSBpbiBzZXFfbGVuKG5DaGFpbnMpKQ0KICAgIHBsb3Qob3V0W1tpXV0sIG1haW4gPSBwYXN0ZSgiQ2hhaW4iLCBpKSwgYXV0by5sYXlvdXQgPSBGQUxTRSwgY29sID0gaSkNCg0KYGBgDQpgYGB7cix9DQpnZWxtYW4uZGlhZyhvdXRbYygyLDMpXSwgdHJhbnNmb3JtID0gRkFMU0UpDQoNCmBgYA0KYGBge3IsfQ0KYXJhYl9wc2JfcmVwM19wYXJhbXNfcG9vbGVkIDwtIG1jbWNfcG9vbF9jaGFpbnMoYXJhYl9wc2JfcmVwM19wYXJhbXNbYygyLDMpXSkNCmFyYWJfcHNiX3JlcDNfcGFyYW1zX3Bvb2xlZA0KDQpgYGANCg0KDQpgYGB7cix9DQphcmFiX3BzYl9yZXAzX3BhcmFtc19wb29sZWQgPC0gdGFnbU1jbWNQcm9jZXNzKGFyYWJfcHNiX3JlcDNfcGFyYW1zX3Bvb2xlZCkNCmFyYWJfcHNiX3JlcDNfcGFyYW1zX3Bvb2xlZA0KDQpgYGANCg0KDQpgYGB7cix9DQphcmFiaWRwb3Npc19wYnNyZXAzIDwtIHRhZ21QcmVkaWN0KG9iamVjdCA9IGFyYWJpZHBvc2lzX3Bic3JlcDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSBhcmFiX3BzYl9yZXAzX3BhcmFtc19wb29sZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iSm9pbnQgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNvbCA9ICJtYXJrZXJzIikNCmhlYWQoZkRhdGEoYXJhYmlkcG9zaXNfcGJzcmVwMykpDQoNCmBgYA0KDQpgYGB7cix9DQpwYXIobWZyb3cgPSBjKDEsIDIpKQ0KcGxvdDJEKGFyYWJpZHBvc2lzX3Bic3JlcDMsIGZjb2wgPSAidGFnbS5tY21jLmFsbG9jYXRpb24iLA0KICAgICAgICBjZXggPSBmRGF0YShhcmFiaWRwb3Npc19wYnNyZXAzKSR0YWdtLm1jbWMucHJvYmFiaWxpdHksDQogICAgICAgIG1haW4gPSAiVEFHTSBNQ01DIGFsbG9jYXRpb25zIikNCmFkZExlZ2VuZChhcmFiaWRwb3Npc19wYnNyZXAzLCBmY29sID0gIm1hcmtlcnMiLA0KICAgICAgICAgICB3aGVyZSA9ICJ0b3BsZWZ0IiwgbmNvbCA9IDIsIGNleCA9IDAuNikNCg0KcGxvdDJEKGFyYWJpZHBvc2lzX3Bic3JlcDMsIGZjb2wgPSAidGFnbS5tY21jLmFsbG9jYXRpb24iLA0KICAgICAgICBjZXggPSBmRGF0YShhcmFiaWRwb3Npc19wYnNyZXAzKSR0YWdtLm1jbWMubWVhbi5zaGFubm9uLA0KICAgICAgICBtYWluID0gIlZpc3VhbGlzaW5nIGdsb2JhbCB1bmNlcnRhaW50eSIpDQphZGRMZWdlbmQoYXJhYmlkcG9zaXNfcGJzcmVwMywgZmNvbCA9ICJtYXJrZXJzIiwNCiAgICAgICAgICAgd2hlcmUgPSAidG9wbGVmdCIsIG5jb2wgPSAyLCBjZXggPSAwLjYpDQoNCmBgYA0KDQpgYGB7cix9DQpzYXZlKGFyYWJfcHNiX3JlcDNfcGFyYW1zX3Bvb2xlZCwgZmlsZSA9ICJhcmFiX3BzYl9yZXAzX3BhcmFtc19wb29sZWQucmRhIikNCnNhdmUoYXJhYmlkcG9zaXNfcGJzcmVwMywgZmlsZSA9ICJhcmFiaWRwb3Npc19wYnNyZXAzX3RhZ20ucmRhIikNCmBgYA0KDQojIFBicyByZXAgMyBtYXJrZXJzIDINCg0KDQpgYGB7cix9DQpsb2FkKCJDOi9Vc2Vycy9PbGx5Qy9EZXNrdG9wLzIwMTktTE9QSVQtUHJvamVjdHMvMjAyMC1IYXJyaWV0LUFyYWJpZG9wc2lzLS9SYXdEYXRhL2FyYWJpZHBvc2lzX3Bic3JlcDMucmRhIikNCmFyYWJfcHNiX3JlcDNfbWFya2VyczJfcGFyYW1zIDwtIHJlYWRSRFMoZmlsZSA9ICJDOi9Vc2Vycy9PbGx5Qy9EZXNrdG9wLzIwMTktTE9QSVQtUHJvamVjdHMvMjAyMC1IYXJyaWV0LUFyYWJpZG9wc2lzLS9SYXdEYXRhL21jbWNfYXJhYmlkcG9zaXNfcGJzcmVwM19tYXJrZXJzMi5yZHMiKQ0KYGBgDQoNCiNpbnRpYWwgdmlzdWFsaXNhdGlvbg0KYGBge3IsfQ0KZkRhdGEoYXJhYmlkcG9zaXNfcGJzcmVwMykkbWFya2VyczJbZkRhdGEoYXJhYmlkcG9zaXNfcGJzcmVwMykkbWFya2VyczIgJWluJSBjKCJjeXRvc29saWMgcmlib3NvbWVzIiwgImV4dHJhY2VsbHVsYXIiKV0gPC0gInVua25vd24iDQpwbG90MkQoYXJhYmlkcG9zaXNfcGJzcmVwMywgZ3JpZCA9IEZBTFNFLCBmY29sID0gIm1hcmtlcnMiKQ0KYWRkTGVnZW5kKGFyYWJpZHBvc2lzX3Bic3JlcDMsIHdoZXJlID0gInRvcGxlZnQiLCBjZXggPSAwLjcsIG5jb2wgPSAyLCBmY29sID0gIm1hcmtlcnMyIikNCmBgYA0KYGBge3IsfQ0Kb3V0IDwtIG1jbWNfZ2V0X291dGxpZXJzKGFyYWJfcHNiX3JlcDNfbWFya2VyczJfcGFyYW1zKQ0KDQpgYGANCg0KDQpgYGB7cix9DQpuQ2hhaW5zIDwtIGxlbmd0aChhcmFiX3BzYl9yZXAzX21hcmtlcnMyX3BhcmFtcykNCm5DaGFpbnMNCmZvciAoaSBpbiBzZXFfbGVuKG5DaGFpbnMpKQ0KICAgIHBsb3Qob3V0W1tpXV0sIG1haW4gPSBwYXN0ZSgiQ2hhaW4iLCBpKSwgYXV0by5sYXlvdXQgPSBGQUxTRSwgY29sID0gaSkNCg0KYGBgDQpgYGB7cix9DQpnZWxtYW4uZGlhZyhvdXRbYygzLDQpXSwgdHJhbnNmb3JtID0gRkFMU0UpDQoNCmBgYA0KYGBge3IsfQ0KYXJhYl9wc2JfcmVwM19tYXJrZXJzMl9wYXJhbXNfcG9vbGVkIDwtIG1jbWNfcG9vbF9jaGFpbnMoYXJhYl9wc2JfcmVwM19tYXJrZXJzMl9wYXJhbXNbYygzLDQpXSkNCmFyYWJfcHNiX3JlcDNfbWFya2VyczJfcGFyYW1zX3Bvb2xlZA0KDQpgYGANCg0KDQpgYGB7cix9DQphcmFiX3BzYl9yZXAzX21hcmtlcnMyX3BhcmFtc19wb29sZWQgPC0gdGFnbU1jbWNQcm9jZXNzKGFyYWJfcHNiX3JlcDNfbWFya2VyczJfcGFyYW1zX3Bvb2xlZCkNCmFyYWJfcHNiX3JlcDNfbWFya2VyczJfcGFyYW1zX3Bvb2xlZA0KDQpgYGANCg0KDQpgYGB7cix9DQphcmFiaWRwb3Npc19wYnNyZXAzIDwtIHRhZ21QcmVkaWN0KG9iamVjdCA9IGFyYWJpZHBvc2lzX3Bic3JlcDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSBhcmFiX3BzYl9yZXAzX21hcmtlcnMyX3BhcmFtc19wb29sZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iSm9pbnQgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNvbCA9ICJtYXJrZXJzMiIpDQpoZWFkKGZEYXRhKGFyYWJpZHBvc2lzX3Bic3JlcDMpKQ0KDQpgYGANCg0KYGBge3IsfQ0KcGFyKG1mcm93ID0gYygxLCAyKSkNCnBsb3QyRChhcmFiaWRwb3Npc19wYnNyZXAzLCBmY29sID0gInRhZ20ubWNtYy5hbGxvY2F0aW9uIiwNCiAgICAgICAgY2V4ID0gZkRhdGEoYXJhYmlkcG9zaXNfcGJzcmVwMykkdGFnbS5tY21jLnByb2JhYmlsaXR5LA0KICAgICAgICBtYWluID0gIlRBR00gTUNNQyBhbGxvY2F0aW9ucyIpDQphZGRMZWdlbmQoYXJhYmlkcG9zaXNfcGJzcmVwMywgZmNvbCA9ICJtYXJrZXJzMiIsDQogICAgICAgICAgIHdoZXJlID0gInRvcGxlZnQiLCBuY29sID0gMiwgY2V4ID0gMC42KQ0KDQpwbG90MkQoYXJhYmlkcG9zaXNfcGJzcmVwMywgZmNvbCA9ICJ0YWdtLm1jbWMuYWxsb2NhdGlvbiIsDQogICAgICAgIGNleCA9IGZEYXRhKGFyYWJpZHBvc2lzX3Bic3JlcDMpJHRhZ20ubWNtYy5tZWFuLnNoYW5ub24sDQogICAgICAgIG1haW4gPSAiVmlzdWFsaXNpbmcgZ2xvYmFsIHVuY2VydGFpbnR5IikNCmFkZExlZ2VuZChhcmFiaWRwb3Npc19wYnNyZXAzLCBmY29sID0gIm1hcmtlcnMyIiwNCiAgICAgICAgICAgd2hlcmUgPSAidG9wbGVmdCIsIG5jb2wgPSAyLCBjZXggPSAwLjYpDQoNCmBgYA0KDQpgYGB7cix9DQpzYXZlKGFyYWJfcHNiX3JlcDNfbWFya2VyczJfcGFyYW1zX3Bvb2xlZCwgZmlsZSA9ICJhcmFiX3BzYl9yZXAzX21hcmtlcnMyX3BhcmFtc19wb29sZWQucmRhIikNCnNhdmUoYXJhYmlkcG9zaXNfcGJzcmVwMywgZmlsZSA9ICJhcmFiaWRwb3Npc19wYnNyZXAzX21hcmtlcnMyX3RhZ20ucmRhIikNCmBgYA0KDQoNCiMgUGJzIHJlcCA0DQoNCg0KYGBge3IsfQ0KbG9hZCgiQzovVXNlcnMvT2xseUMvRGVza3RvcC8yMDE5LUxPUElULVByb2plY3RzLzIwMjAtSGFycmlldC1BcmFiaWRvcHNpcy0vUmF3RGF0YS9hcmFiaWRwb3Npc19wYnNyZXA0LnJkYSIpDQphcmFiX3BzYl9yZXA0X3BhcmFtcyA8LSByZWFkUkRTKGZpbGUgPSAiQzovVXNlcnMvT2xseUMvRGVza3RvcC8yMDE5LUxPUElULVByb2plY3RzLzIwMjAtSGFycmlldC1BcmFiaWRvcHNpcy0vUmF3RGF0YS9tY21jX2FyYWJpZHBvc2lzX3Bic3JlcDQucmRzIikNCmBgYA0KDQojaW50aWFsIHZpc3VhbGlzYXRpb24NCmBgYHtyLH0NCmZEYXRhKGFyYWJpZHBvc2lzX3Bic3JlcDQpJG1hcmtlcnNbZkRhdGEoYXJhYmlkcG9zaXNfcGJzcmVwNCkkbWFya2VycyAlaW4lIGMoImN5dG9zb2xpYyByaWJvc29tZXMiLCAiZXh0cmFjZWxsdWxhciIpXSA8LSAidW5rbm93biINCnBsb3QyRChhcmFiaWRwb3Npc19wYnNyZXA0LCBncmlkID0gRkFMU0UsIGZjb2wgPSAibWFya2VycyIpDQphZGRMZWdlbmQoYXJhYmlkcG9zaXNfcGJzcmVwNCwgd2hlcmUgPSAidG9wbGVmdCIsIGNleCA9IDAuNywgbmNvbCA9IDIsIGZjb2wgPSAibWFya2VycyIpDQpgYGANCmBgYHtyLH0NCm91dCA8LSBtY21jX2dldF9vdXRsaWVycyhhcmFiX3BzYl9yZXA0X3BhcmFtcykNCg0KYGBgDQoNCg0KYGBge3IsfQ0KbkNoYWlucyA8LSBsZW5ndGgoYXJhYl9wc2JfcmVwNF9wYXJhbXMpDQpuQ2hhaW5zDQpmb3IgKGkgaW4gc2VxX2xlbihuQ2hhaW5zKSkNCiAgICBwbG90KG91dFtbaV1dLCBtYWluID0gcGFzdGUoIkNoYWluIiwgaSksIGF1dG8ubGF5b3V0ID0gRkFMU0UsIGNvbCA9IGkpDQoNCmBgYA0KYGBge3IsfQ0KZ2VsbWFuLmRpYWcob3V0W2MoMSwyKV0sIHRyYW5zZm9ybSA9IEZBTFNFKQ0KDQpgYGANCmBgYHtyLH0NCmFyYWJfcHNiX3JlcDRfcGFyYW1zX3Bvb2xlZCA8LSBtY21jX3Bvb2xfY2hhaW5zKGFyYWJfcHNiX3JlcDRfcGFyYW1zW2MoMSwyKV0pDQphcmFiX3BzYl9yZXA0X3BhcmFtc19wb29sZWQNCg0KYGBgDQoNCg0KYGBge3IsfQ0KYXJhYl9wc2JfcmVwNF9wYXJhbXNfcG9vbGVkIDwtIHRhZ21NY21jUHJvY2VzcyhhcmFiX3BzYl9yZXA0X3BhcmFtc19wb29sZWQpDQphcmFiX3BzYl9yZXA0X3BhcmFtc19wb29sZWQNCg0KYGBgDQoNCg0KYGBge3IsfQ0KYXJhYmlkcG9zaXNfcGJzcmVwNCA8LSB0YWdtUHJlZGljdChvYmplY3QgPSBhcmFiaWRwb3Npc19wYnNyZXA0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gYXJhYl9wc2JfcmVwNF9wYXJhbXNfcG9vbGVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYkpvaW50ID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZjb2wgPSAibWFya2VycyIpDQpoZWFkKGZEYXRhKGFyYWJpZHBvc2lzX3Bic3JlcDQpKQ0KDQpgYGANCg0KYGBge3IsfQ0KcGFyKG1mcm93ID0gYygxLCAyKSkNCnBsb3QyRChhcmFiaWRwb3Npc19wYnNyZXA0LCBmY29sID0gInRhZ20ubWNtYy5hbGxvY2F0aW9uIiwNCiAgICAgICAgY2V4ID0gZkRhdGEoYXJhYmlkcG9zaXNfcGJzcmVwNCkkdGFnbS5tY21jLnByb2JhYmlsaXR5LA0KICAgICAgICBtYWluID0gIlRBR00gTUNNQyBhbGxvY2F0aW9ucyIpDQphZGRMZWdlbmQoYXJhYmlkcG9zaXNfcGJzcmVwNCwgZmNvbCA9ICJtYXJrZXJzIiwNCiAgICAgICAgICAgd2hlcmUgPSAidG9wbGVmdCIsIG5jb2wgPSAyLCBjZXggPSAwLjYpDQoNCnBsb3QyRChhcmFiaWRwb3Npc19wYnNyZXA0LCBmY29sID0gInRhZ20ubWNtYy5hbGxvY2F0aW9uIiwNCiAgICAgICAgY2V4ID0gZkRhdGEoYXJhYmlkcG9zaXNfcGJzcmVwNCkkdGFnbS5tY21jLm1lYW4uc2hhbm5vbiwNCiAgICAgICAgbWFpbiA9ICJWaXN1YWxpc2luZyBnbG9iYWwgdW5jZXJ0YWludHkiKQ0KYWRkTGVnZW5kKGFyYWJpZHBvc2lzX3Bic3JlcDQsIGZjb2wgPSAibWFya2VycyIsDQogICAgICAgICAgIHdoZXJlID0gInRvcGxlZnQiLCBuY29sID0gMiwgY2V4ID0gMC42KQ0KDQpgYGANCg0KYGBge3IsfQ0Kc2F2ZShhcmFiX3BzYl9yZXA0X3BhcmFtc19wb29sZWQsIGZpbGUgPSAiYXJhYl9wc2JfcmVwNF9wb29sZWQucmRhIikNCnNhdmUoYXJhYmlkcG9zaXNfcGJzcmVwNCwgZmlsZSA9ICJhcmFiaWRwb3Npc19wYnNyZXA0X3RhZ20ucmRhIikNCmBgYA0KDQojIGFyYWJpZG9wc2lzIHBicyByZXAgNCBtYXJrZXJzMg0KDQpgYGB7cix9DQpsb2FkKCJDOi9Vc2Vycy9PbGx5Qy9EZXNrdG9wLzIwMTktTE9QSVQtUHJvamVjdHMvMjAyMC1IYXJyaWV0LUFyYWJpZG9wc2lzLS9SYXdEYXRhL2FyYWJpZHBvc2lzX3Bic3JlcDQucmRhIikNCmFyYWJfcHNiX3JlcDRfcGFyYW1zX21hcmtlcnMyIDwtIHJlYWRSRFMoZmlsZSA9ICJDOi9Vc2Vycy9PbGx5Qy9EZXNrdG9wLzIwMTktTE9QSVQtUHJvamVjdHMvMjAyMC1IYXJyaWV0LUFyYWJpZG9wc2lzLS9SYXdEYXRhL21jbWNfYXJhYmlkcG9zaXNfcGJzcmVwNF9tYXJrZXJzMi5yZHMiKQ0KYGBgDQoNCiNpbnRpYWwgdmlzdWFsaXNhdGlvbg0KYGBge3IsfQ0KZkRhdGEoYXJhYmlkcG9zaXNfcGJzcmVwNCkkbWFya2VyczJbZkRhdGEoYXJhYmlkcG9zaXNfcGJzcmVwNCkkbWFya2VyczIgJWluJSBjKCJjeXRvc29saWMgcmlib3NvbWVzIiwgImV4dHJhY2VsbHVsYXIiKV0gPC0gInVua25vd24iDQpwbG90MkQoYXJhYmlkcG9zaXNfcGJzcmVwNCwgZ3JpZCA9IEZBTFNFLCBmY29sID0gIm1hcmtlcnMyIikNCmFkZExlZ2VuZChhcmFiaWRwb3Npc19wYnNyZXA0LCB3aGVyZSA9ICJ0b3BsZWZ0IiwgY2V4ID0gMC43LCBuY29sID0gMiwgZmNvbCA9ICJtYXJrZXJzMiIpDQpgYGANCmBgYHtyLH0NCm91dCA8LSBtY21jX2dldF9vdXRsaWVycyhhcmFiX3BzYl9yZXA0X3BhcmFtc19tYXJrZXJzMikNCg0KYGBgDQoNCg0KYGBge3IsfQ0KbkNoYWlucyA8LSBsZW5ndGgoYXJhYl9wc2JfcmVwNF9wYXJhbXNfbWFya2VyczIpDQpuQ2hhaW5zDQpmb3IgKGkgaW4gc2VxX2xlbihuQ2hhaW5zKSkNCiAgICBwbG90KG91dFtbaV1dLCBtYWluID0gcGFzdGUoIkNoYWluIiwgaSksIGF1dG8ubGF5b3V0ID0gRkFMU0UsIGNvbCA9IGkpDQoNCmBgYA0KYGBge3IsfQ0KZ2VsbWFuLmRpYWcob3V0W2MoMyw0KV0sIHRyYW5zZm9ybSA9IEZBTFNFKQ0KDQpgYGANCmBgYHtyLH0NCmFyYWJfcHNiX3JlcDRfcGFyYW1zX21hcmtlcnMyX3Bvb2xlZCA8LSBtY21jX3Bvb2xfY2hhaW5zKGFyYWJfcHNiX3JlcDRfcGFyYW1zX21hcmtlcnMyW2MoMyw0KV0pDQphcmFiX3BzYl9yZXA0X3BhcmFtc19tYXJrZXJzMl9wb29sZWQNCg0KYGBgDQoNCg0KYGBge3IsfQ0KYXJhYl9wc2JfcmVwNF9wYXJhbXNfbWFya2VyczJfcG9vbGVkIDwtIHRhZ21NY21jUHJvY2VzcyhhcmFiX3BzYl9yZXA0X3BhcmFtc19tYXJrZXJzMl9wb29sZWQpDQphcmFiX3BzYl9yZXA0X3BhcmFtc19tYXJrZXJzMl9wb29sZWQNCg0KYGBgDQoNCg0KYGBge3IsfQ0KYXJhYmlkcG9zaXNfcGJzcmVwNCA8LSB0YWdtUHJlZGljdChvYmplY3QgPSBhcmFiaWRwb3Npc19wYnNyZXA0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gYXJhYl9wc2JfcmVwNF9wYXJhbXNfbWFya2VyczJfcG9vbGVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYkpvaW50ID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZjb2wgPSAibWFya2VyczIiKQ0KaGVhZChmRGF0YShhcmFiaWRwb3Npc19wYnNyZXA0KSkNCg0KYGBgDQoNCmBgYHtyLH0NCnBhcihtZnJvdyA9IGMoMSwgMikpDQpwbG90MkQoYXJhYmlkcG9zaXNfcGJzcmVwNCwgZmNvbCA9ICJ0YWdtLm1jbWMuYWxsb2NhdGlvbiIsDQogICAgICAgIGNleCA9IGZEYXRhKGFyYWJpZHBvc2lzX3Bic3JlcDQpJHRhZ20ubWNtYy5wcm9iYWJpbGl0eSwNCiAgICAgICAgbWFpbiA9ICJUQUdNIE1DTUMgYWxsb2NhdGlvbnMiKQ0KYWRkTGVnZW5kKGFyYWJpZHBvc2lzX3Bic3JlcDQsIGZjb2wgPSAibWFya2VyczIiLA0KICAgICAgICAgICB3aGVyZSA9ICJ0b3BsZWZ0IiwgbmNvbCA9IDIsIGNleCA9IDAuNikNCg0KcGxvdDJEKGFyYWJpZHBvc2lzX3Bic3JlcDQsIGZjb2wgPSAidGFnbS5tY21jLmFsbG9jYXRpb24iLA0KICAgICAgICBjZXggPSBmRGF0YShhcmFiaWRwb3Npc19wYnNyZXA0KSR0YWdtLm1jbWMubWVhbi5zaGFubm9uLA0KICAgICAgICBtYWluID0gIlZpc3VhbGlzaW5nIGdsb2JhbCB1bmNlcnRhaW50eSIpDQphZGRMZWdlbmQoYXJhYmlkcG9zaXNfcGJzcmVwNCwgZmNvbCA9ICJtYXJrZXJzMiIsDQogICAgICAgICAgIHdoZXJlID0gInRvcGxlZnQiLCBuY29sID0gMiwgY2V4ID0gMC42KQ0KDQpgYGANCg0KYGBge3IsfQ0Kc2F2ZShhcmFiX3BzYl9yZXA0X3BhcmFtc19tYXJrZXJzMl9wb29sZWQsIGZpbGUgPSAiYXJhYl9wc2JfcmVwNF9wYXJhbXNfbWFya2VyczJfcG9vbGVkLnJkYSIpDQpzYXZlKGFyYWJpZHBvc2lzX3Bic3JlcDQsIGZpbGUgPSAiYXJhYmlkcG9zaXNfcGJzcmVwNF9tYXJrZXJzMl90YWdtLnJkYSIpDQpgYGANCg0KDQojIFBCUyBjb21iaW5lZCByZXBsaWNhdGVzDQoNCmBgYHtyLH0NCmxvYWQoIkM6L1VzZXJzL09sbHlDL0Rlc2t0b3AvMjAxOS1MT1BJVC1Qcm9qZWN0cy8yMDIwLUhhcnJpZXQtQXJhYmlkb3BzaXMtL1Jhd0RhdGEvYXJhYmlkcG9zaXNfcGJzLnJkYSIpDQphcmFiX3BzYl9wYXJhbXMgPC0gcmVhZFJEUyhmaWxlID0gIkM6L1VzZXJzL09sbHlDL0Rlc2t0b3AvMjAxOS1MT1BJVC1Qcm9qZWN0cy8yMDIwLUhhcnJpZXQtQXJhYmlkb3BzaXMtL1Jhd0RhdGEvbWNtY19hcmFiaWRwb3Npc19wYnMucmRzIikNCmBgYA0KDQojaW50aWFsIHZpc3VhbGlzYXRpb24NCmBgYHtyLH0NCmZEYXRhKGFyYWJpZHBvc2lzX3BicykkbWFya2Vyc1tmRGF0YShhcmFiaWRwb3Npc19wYnMpJG1hcmtlcnMgJWluJSBjKCJjeXRvc29saWMgcmlib3NvbWVzIiwgImV4dHJhY2VsbHVsYXIiKV0gPC0gInVua25vd24iDQpwbG90MkQoYXJhYmlkcG9zaXNfcGJzLCBncmlkID0gRkFMU0UsIGZjb2wgPSAibWFya2VycyIpDQphZGRMZWdlbmQoYXJhYmlkcG9zaXNfcGJzcmVwNCwgd2hlcmUgPSAidG9wbGVmdCIsIGNleCA9IDAuNywgbmNvbCA9IDIsIGZjb2wgPSAibWFya2VycyIpDQpgYGANCmBgYHtyLH0NCm91dCA8LSBtY21jX2dldF9vdXRsaWVycyhhcmFiX3BzYl9wYXJhbXMpDQoNCmBgYA0KDQoNCmBgYHtyLH0NCm5DaGFpbnMgPC0gbGVuZ3RoKGFyYWJfcHNiX3BhcmFtcykNCm5DaGFpbnMNCmZvciAoaSBpbiBzZXFfbGVuKG5DaGFpbnMpKQ0KICAgIHBsb3Qob3V0W1tpXV0sIG1haW4gPSBwYXN0ZSgiQ2hhaW4iLCBpKSwgYXV0by5sYXlvdXQgPSBGQUxTRSwgY29sID0gaSkNCg0KYGBgDQpgYGB7cix9DQpnZWxtYW4uZGlhZyhvdXRbYygxLDIsMyw0KV0sIHRyYW5zZm9ybSA9IEZBTFNFKQ0KDQpgYGANCmBgYHtyLH0NCmFyYWJfcHNiX3BhcmFtc19wb29sZWQgPC0gbWNtY19wb29sX2NoYWlucyhhcmFiX3BzYl9wYXJhbXNbYygxLDIsMyw0KV0pDQphcmFiX3BzYl9wYXJhbXNfcG9vbGVkDQoNCmBgYA0KDQoNCmBgYHtyLH0NCmFyYWJfcHNiX3BhcmFtc19wb29sZWQgPC0gdGFnbU1jbWNQcm9jZXNzKGFyYWJfcHNiX3BhcmFtc19wb29sZWQpDQphcmFiX3BzYl9wYXJhbXNfcG9vbGVkDQoNCmBgYA0KDQoNCmBgYHtyLH0NCmFyYWJpZHBvc2lzX3BicyA8LSB0YWdtUHJlZGljdChvYmplY3QgPSBhcmFiaWRwb3Npc19wYnMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSBhcmFiX3BzYl9wYXJhbXNfcG9vbGVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYkpvaW50ID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZjb2wgPSAibWFya2VycyIpDQpoZWFkKGZEYXRhKGFyYWJpZHBvc2lzX3BicykpDQoNCmBgYA0KDQpgYGB7cix9DQpwYXIobWZyb3cgPSBjKDEsIDIpKQ0KcGxvdDJEKGFyYWJpZHBvc2lzX3BicywgZmNvbCA9ICJ0YWdtLm1jbWMuYWxsb2NhdGlvbiIsDQogICAgICAgIGNleCA9IGZEYXRhKGFyYWJpZHBvc2lzX3BicykkdGFnbS5tY21jLnByb2JhYmlsaXR5LA0KICAgICAgICBtYWluID0gIlRBR00gTUNNQyBhbGxvY2F0aW9ucyIpDQphZGRMZWdlbmQoYXJhYmlkcG9zaXNfcGJzcmVwNCwgZmNvbCA9ICJtYXJrZXJzIiwNCiAgICAgICAgICAgd2hlcmUgPSAidG9wbGVmdCIsIG5jb2wgPSAyLCBjZXggPSAwLjYpDQoNCnBsb3QyRChhcmFiaWRwb3Npc19wYnMsIGZjb2wgPSAidGFnbS5tY21jLmFsbG9jYXRpb24iLA0KICAgICAgICBjZXggPSBmRGF0YShhcmFiaWRwb3Npc19wYnMpJHRhZ20ubWNtYy5tZWFuLnNoYW5ub24sDQogICAgICAgIG1haW4gPSAiVmlzdWFsaXNpbmcgZ2xvYmFsIHVuY2VydGFpbnR5IikNCmFkZExlZ2VuZChhcmFiaWRwb3Npc19wYnNyZXA0LCBmY29sID0gIm1hcmtlcnMiLA0KICAgICAgICAgICB3aGVyZSA9ICJ0b3BsZWZ0IiwgbmNvbCA9IDIsIGNleCA9IDAuNikNCg0KYGBgDQoNCmBgYHtyLH0NCnNhdmUoYXJhYl9wc2JfcGFyYW1zX3Bvb2xlZCwgZmlsZSA9ICJhcmFiX3BzYl9wYXJhbXNfcG9vbGVkLnJkYSIpDQpzYXZlKGFyYWJpZHBvc2lzX3BicywgZmlsZSA9ICJhcmFiaWRwb3Npc19wYnNfdGFnbS5yZGEiKQ0KYGBgDQoNCiMjIFBicyBjb21iaW5lZCBtYXJrZXJzMg0KYGBge3IsfQ0KbG9hZCgiQzovVXNlcnMvT2xseUMvRGVza3RvcC8yMDE5LUxPUElULVByb2plY3RzLzIwMjAtSGFycmlldC1BcmFiaWRvcHNpcy0vUmF3RGF0YS9hcmFiaWRwb3Npc19wYnMucmRhIikNCmFyYWJfcHNiX3BhcmFtc19tYXJrZXJzMiA8LSByZWFkUkRTKGZpbGUgPSAiQzovVXNlcnMvT2xseUMvRGVza3RvcC8yMDE5LUxPUElULVByb2plY3RzLzIwMjAtSGFycmlldC1BcmFiaWRvcHNpcy0vUmF3RGF0YS9tY21jX2FyYWJpZHBvc2lzX3Bic19tYXJrZXJzMi5yZHMiKQ0KYGBgDQoNCiNpbnRpYWwgdmlzdWFsaXNhdGlvbg0KYGBge3IsfQ0KZkRhdGEoYXJhYmlkcG9zaXNfcGJzKSRtYXJrZXJzMltmRGF0YShhcmFiaWRwb3Npc19wYnMpJG1hcmtlcnMyICVpbiUgYygiY3l0b3NvbGljIHJpYm9zb21lcyIsICJleHRyYWNlbGx1bGFyIildIDwtICJ1bmtub3duIg0KcGxvdDJEKGFyYWJpZHBvc2lzX3BicywgZ3JpZCA9IEZBTFNFLCBmY29sID0gIm1hcmtlcnMyIikNCmFkZExlZ2VuZChhcmFiaWRwb3Npc19wYnMsIHdoZXJlID0gInRvcGxlZnQiLCBjZXggPSAwLjcsIG5jb2wgPSAyLCBmY29sID0gIm1hcmtlcnMyIikNCmBgYA0KYGBge3IsfQ0Kb3V0IDwtIG1jbWNfZ2V0X291dGxpZXJzKGFyYWJfcHNiX3BhcmFtc19tYXJrZXJzMikNCg0KYGBgDQoNCg0KYGBge3IsfQ0KbkNoYWlucyA8LSBsZW5ndGgoYXJhYl9wc2JfcGFyYW1zX21hcmtlcnMyKQ0KbkNoYWlucw0KZm9yIChpIGluIHNlcV9sZW4obkNoYWlucykpDQogICAgcGxvdChvdXRbW2ldXSwgbWFpbiA9IHBhc3RlKCJDaGFpbiIsIGkpLCBhdXRvLmxheW91dCA9IEZBTFNFLCBjb2wgPSBpKQ0KDQpgYGANCmBgYHtyLH0NCmdlbG1hbi5kaWFnKG91dFtjKDIsMyldLCB0cmFuc2Zvcm0gPSBGQUxTRSkNCg0KYGBgDQpgYGB7cix9DQphcmFiX3BzYl9wYXJhbXNfbWFya2VyczJfcG9vbGVkIDwtIG1jbWNfcG9vbF9jaGFpbnMoYXJhYl9wc2JfcGFyYW1zX21hcmtlcnMyW2MoMiwzKV0pDQphcmFiX3BzYl9wYXJhbXNfbWFya2VyczJfcG9vbGVkDQoNCmBgYA0KDQoNCmBgYHtyLH0NCmFyYWJfcHNiX3BhcmFtc19tYXJrZXJzMl9wb29sZWQgPC0gdGFnbU1jbWNQcm9jZXNzKGFyYWJfcHNiX3BhcmFtc19tYXJrZXJzMl9wb29sZWQpDQphcmFiX3BzYl9wYXJhbXNfbWFya2VyczJfcG9vbGVkDQoNCmBgYA0KDQoNCmBgYHtyLH0NCmFyYWJpZHBvc2lzX3BicyA8LSB0YWdtUHJlZGljdChvYmplY3QgPSBhcmFiaWRwb3Npc19wYnMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSBhcmFiX3BzYl9wYXJhbXNfbWFya2VyczJfcG9vbGVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYkpvaW50ID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZjb2wgPSAibWFya2VyczIiKQ0KaGVhZChmRGF0YShhcmFiaWRwb3Npc19wYnMpKQ0KDQpgYGANCg0KYGBge3IsfQ0KcGFyKG1mcm93ID0gYygxLCAyKSkNCnBsb3QyRChhcmFiaWRwb3Npc19wYnMsIGZjb2wgPSAidGFnbS5tY21jLmFsbG9jYXRpb24iLA0KICAgICAgICBjZXggPSBmRGF0YShhcmFiaWRwb3Npc19wYnMpJHRhZ20ubWNtYy5wcm9iYWJpbGl0eSwNCiAgICAgICAgbWFpbiA9ICJUQUdNIE1DTUMgYWxsb2NhdGlvbnMiKQ0KYWRkTGVnZW5kKGFyYWJpZHBvc2lzX3Bic3JlcDQsIGZjb2wgPSAibWFya2VyczIiLA0KICAgICAgICAgICB3aGVyZSA9ICJ0b3BsZWZ0IiwgbmNvbCA9IDIsIGNleCA9IDAuNikNCg0KcGxvdDJEKGFyYWJpZHBvc2lzX3BicywgZmNvbCA9ICJ0YWdtLm1jbWMuYWxsb2NhdGlvbiIsDQogICAgICAgIGNleCA9IGZEYXRhKGFyYWJpZHBvc2lzX3BicykkdGFnbS5tY21jLm1lYW4uc2hhbm5vbiwNCiAgICAgICAgbWFpbiA9ICJWaXN1YWxpc2luZyBnbG9iYWwgdW5jZXJ0YWludHkiKQ0KYWRkTGVnZW5kKGFyYWJpZHBvc2lzX3Bic3JlcDQsIGZjb2wgPSAibWFya2VyczIiLA0KICAgICAgICAgICB3aGVyZSA9ICJ0b3BsZWZ0IiwgbmNvbCA9IDIsIGNleCA9IDAuNikNCg0KYGBgDQoNCmBgYHtyLH0NCnNhdmUoYXJhYl9wc2JfcGFyYW1zX21hcmtlcnMyX3Bvb2xlZCwgZmlsZSA9ICJhcmFiX3BzYl9wYXJhbXNfbWFya2VyczJfcG9vbGVkLnJkYSIpDQpzYXZlKGFyYWJpZHBvc2lzX3BicywgZmlsZSA9ICJhcmFiaWRwb3Npc19wYnNfbWFya2VyczJfdGFnbS5yZGEiKQ0KYGBgDQoNCg0KIyBDTzMgcmVwIDENCg0KYGBge3IsfQ0KbG9hZCgiQzovVXNlcnMvT2xseUMvRGVza3RvcC8yMDE5LUxPUElULVByb2plY3RzLzIwMjAtSGFycmlldC1BcmFiaWRvcHNpcy0vUmF3RGF0YS9hcmFiaWRwb3Npc19jbzNyZXAxLnJkYSIpDQphcmFiX2NvM3JlcDFfcGFyYW1zIDwtIHJlYWRSRFMoZmlsZSA9ICJDOi9Vc2Vycy9PbGx5Qy9EZXNrdG9wLzIwMTktTE9QSVQtUHJvamVjdHMvMjAyMC1IYXJyaWV0LUFyYWJpZG9wc2lzLS9SYXdEYXRhL21jbWNfYXJhYmlkcG9zaXNfY28zcmVwMS5yZHMiKQ0KYGBgDQoNCiNpbnRpYWwgdmlzdWFsaXNhdGlvbg0KYGBge3IsfQ0KZkRhdGEoYXJhYmlkcG9zaXNfY28zcmVwMSkkbWFya2Vyc1tmRGF0YShhcmFiaWRwb3Npc19jbzNyZXAxKSRtYXJrZXJzICVpbiUgYygiY3l0b3NvbGljIHJpYm9zb21lcyIsICJleHRyYWNlbGx1bGFyIildIDwtICJ1bmtub3duIg0KcGxvdDJEKGFyYWJpZHBvc2lzX2NvM3JlcDEsIGdyaWQgPSBGQUxTRSwgZmNvbCA9ICJtYXJrZXJzIikNCmFkZExlZ2VuZChhcmFiaWRwb3Npc19jbzNyZXAxLCB3aGVyZSA9ICJ0b3BsZWZ0IiwgY2V4ID0gMC43LCBuY29sID0gMiwgZmNvbCA9ICJtYXJrZXJzIikNCmBgYA0KYGBge3IsfQ0Kb3V0IDwtIG1jbWNfZ2V0X291dGxpZXJzKGFyYWJfY28zcmVwMV9wYXJhbXMpDQoNCmBgYA0KDQoNCmBgYHtyLH0NCm5DaGFpbnMgPC0gbGVuZ3RoKGFyYWJfY28zcmVwMV9wYXJhbXMpDQpuQ2hhaW5zDQpmb3IgKGkgaW4gc2VxX2xlbihuQ2hhaW5zKSkNCiAgICBwbG90KG91dFtbaV1dLCBtYWluID0gcGFzdGUoIkNoYWluIiwgaSksIGF1dG8ubGF5b3V0ID0gRkFMU0UsIGNvbCA9IGkpDQoNCmBgYA0KYGBge3IsfQ0KZ2VsbWFuLmRpYWcob3V0W2MoMiwzKV0sIHRyYW5zZm9ybSA9IEZBTFNFKQ0KDQpgYGANCmBgYHtyLH0NCmFyYWJfY28zcmVwMV9wYXJhbXNfcG9vbGVkIDwtIG1jbWNfcG9vbF9jaGFpbnMoYXJhYl9jbzNyZXAxX3BhcmFtc1tjKDIsMyldKQ0KYXJhYl9jbzNyZXAxX3BhcmFtc19wb29sZWQNCg0KYGBgDQoNCg0KYGBge3IsfQ0KYXJhYl9jbzNyZXAxX3BhcmFtc19wb29sZWQgPC0gdGFnbU1jbWNQcm9jZXNzKGFyYWJfY28zcmVwMV9wYXJhbXNfcG9vbGVkKQ0KYXJhYl9jbzNyZXAxX3BhcmFtc19wb29sZWQNCg0KYGBgDQoNCg0KYGBge3IsfQ0KYXJhYmlkcG9zaXNfY28zcmVwMSA8LSB0YWdtUHJlZGljdChvYmplY3QgPSBhcmFiaWRwb3Npc19jbzNyZXAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gYXJhYl9jbzNyZXAxX3BhcmFtc19wb29sZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iSm9pbnQgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNvbCA9ICJtYXJrZXJzIikNCmhlYWQoZkRhdGEoYXJhYmlkcG9zaXNfY28zcmVwMSkpDQoNCmBgYA0KDQpgYGB7cix9DQpwYXIobWZyb3cgPSBjKDEsIDIpKQ0KcGxvdDJEKGFyYWJpZHBvc2lzX2NvM3JlcDEsIGZjb2wgPSAidGFnbS5tY21jLmFsbG9jYXRpb24iLA0KICAgICAgICBjZXggPSBmRGF0YShhcmFiaWRwb3Npc19jbzNyZXAxKSR0YWdtLm1jbWMucHJvYmFiaWxpdHksDQogICAgICAgIG1haW4gPSAiVEFHTSBNQ01DIGFsbG9jYXRpb25zIikNCmFkZExlZ2VuZChhcmFiaWRwb3Npc19wYnNyZXA0LCBmY29sID0gIm1hcmtlcnMiLA0KICAgICAgICAgICB3aGVyZSA9ICJ0b3BsZWZ0IiwgbmNvbCA9IDIsIGNleCA9IDAuNikNCg0KcGxvdDJEKGFyYWJpZHBvc2lzX2NvM3JlcDEsIGZjb2wgPSAidGFnbS5tY21jLmFsbG9jYXRpb24iLA0KICAgICAgICBjZXggPSBmRGF0YShhcmFiaWRwb3Npc19jbzNyZXAxKSR0YWdtLm1jbWMubWVhbi5zaGFubm9uLA0KICAgICAgICBtYWluID0gIlZpc3VhbGlzaW5nIGdsb2JhbCB1bmNlcnRhaW50eSIpDQphZGRMZWdlbmQoYXJhYmlkcG9zaXNfcGJzcmVwNCwgZmNvbCA9ICJtYXJrZXJzIiwNCiAgICAgICAgICAgd2hlcmUgPSAidG9wbGVmdCIsIG5jb2wgPSAyLCBjZXggPSAwLjYpDQoNCmBgYA0KDQpgYGB7cix9DQpzYXZlKGFyYWJfY28zcmVwMV9wYXJhbXNfcG9vbGVkLCBmaWxlID0gImFyYWJfY28zcmVwMV9wYXJhbXNfcG9vbGVkLnJkYSIpDQpzYXZlKGFyYWJpZHBvc2lzX2NvM3JlcDEsIGZpbGUgPSAiYXJhYmlkcG9zaXNfY28zcmVwMV90YWdtLnJkYSIpDQpgYGANCg0KDQojIENPMyByZXAgMSBtYXJrZXIyDQoNCmBgYHtyLH0NCmxvYWQoIkM6L1VzZXJzL09sbHlDL0Rlc2t0b3AvMjAxOS1MT1BJVC1Qcm9qZWN0cy8yMDIwLUhhcnJpZXQtQXJhYmlkb3BzaXMtL1Jhd0RhdGEvYXJhYmlkcG9zaXNfY28zcmVwMS5yZGEiKQ0KYXJhYl9jbzNyZXAxX21hcmtlcjJfcGFyYW1zIDwtIHJlYWRSRFMoZmlsZSA9ICJDOi9Vc2Vycy9PbGx5Qy9EZXNrdG9wLzIwMTktTE9QSVQtUHJvamVjdHMvMjAyMC1IYXJyaWV0LUFyYWJpZG9wc2lzLS9SYXdEYXRhL21jbWNfYXJhYmlkcG9zaXNfY28zcmVwMV9tYXJrZXJzMi5yZHMiKQ0KYGBgDQoNCiNpbnRpYWwgdmlzdWFsaXNhdGlvbg0KYGBge3IsfQ0KZkRhdGEoYXJhYmlkcG9zaXNfY28zcmVwMSkkbWFya2VyczJbZkRhdGEoYXJhYmlkcG9zaXNfY28zcmVwMSkkbWFya2VyczIgJWluJSBjKCJjeXRvc29saWMgcmlib3NvbWVzIiwgImV4dHJhY2VsbHVsYXIiKV0gPC0gInVua25vd24iDQpwbG90MkQoYXJhYmlkcG9zaXNfY28zcmVwMSwgZ3JpZCA9IEZBTFNFLCBmY29sID0gIm1hcmtlcnMyIikNCmFkZExlZ2VuZChhcmFiaWRwb3Npc19jbzNyZXAxLCB3aGVyZSA9ICJ0b3BsZWZ0IiwgY2V4ID0gMC43LCBuY29sID0gMiwgZmNvbCA9ICJtYXJrZXJzMiIpDQpgYGANCmBgYHtyLH0NCm91dCA8LSBtY21jX2dldF9vdXRsaWVycyhhcmFiX2NvM3JlcDFfbWFya2VyMl9wYXJhbXMpDQoNCmBgYA0KDQoNCmBgYHtyLH0NCm5DaGFpbnMgPC0gbGVuZ3RoKGFyYWJfY28zcmVwMV9tYXJrZXIyX3BhcmFtcykNCm5DaGFpbnMNCmZvciAoaSBpbiBzZXFfbGVuKG5DaGFpbnMpKQ0KICAgIHBsb3Qob3V0W1tpXV0sIG1haW4gPSBwYXN0ZSgiQ2hhaW4iLCBpKSwgYXV0by5sYXlvdXQgPSBGQUxTRSwgY29sID0gaSkNCg0KYGBgDQpgYGB7cix9DQpnZWxtYW4uZGlhZyhvdXRbYygyLDMsNCldLCB0cmFuc2Zvcm0gPSBGQUxTRSkNCg0KYGBgDQpgYGB7cix9DQphcmFiX2NvM3JlcDFfbWFya2VyMl9wYXJhbXNfcG9vbGVkIDwtIG1jbWNfcG9vbF9jaGFpbnMoYXJhYl9jbzNyZXAxX21hcmtlcjJfcGFyYW1zW2MoMiwzLDQpXSkNCmFyYWJfY28zcmVwMV9tYXJrZXIyX3BhcmFtc19wb29sZWQNCg0KYGBgDQoNCg0KYGBge3IsfQ0KYXJhYl9jbzNyZXAxX21hcmtlcjJfcGFyYW1zX3Bvb2xlZCA8LSB0YWdtTWNtY1Byb2Nlc3MoYXJhYl9jbzNyZXAxX21hcmtlcjJfcGFyYW1zX3Bvb2xlZCkNCmFyYWJfY28zcmVwMV9tYXJrZXIyX3BhcmFtc19wb29sZWQNCg0KYGBgDQoNCg0KYGBge3IsfQ0KYXJhYmlkcG9zaXNfY28zcmVwMSA8LSB0YWdtUHJlZGljdChvYmplY3QgPSBhcmFiaWRwb3Npc19jbzNyZXAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gYXJhYl9jbzNyZXAxX21hcmtlcjJfcGFyYW1zX3Bvb2xlZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JKb2ludCA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBmY29sID0gIm1hcmtlcnMyIikNCmhlYWQoZkRhdGEoYXJhYmlkcG9zaXNfY28zcmVwMSkpDQoNCmBgYA0KDQpgYGB7cix9DQpwYXIobWZyb3cgPSBjKDEsIDIpKQ0KcGxvdDJEKGFyYWJpZHBvc2lzX2NvM3JlcDEsIGZjb2wgPSAidGFnbS5tY21jLmFsbG9jYXRpb24iLA0KICAgICAgICBjZXggPSBmRGF0YShhcmFiaWRwb3Npc19jbzNyZXAxKSR0YWdtLm1jbWMucHJvYmFiaWxpdHksDQogICAgICAgIG1haW4gPSAiVEFHTSBNQ01DIGFsbG9jYXRpb25zIikNCmFkZExlZ2VuZChhcmFiaWRwb3Npc19jbzNyZXAxLCBmY29sID0gIm1hcmtlcnMyIiwNCiAgICAgICAgICAgd2hlcmUgPSAidG9wbGVmdCIsIG5jb2wgPSAyLCBjZXggPSAwLjYpDQoNCnBsb3QyRChhcmFiaWRwb3Npc19jbzNyZXAxLCBmY29sID0gInRhZ20ubWNtYy5hbGxvY2F0aW9uIiwNCiAgICAgICAgY2V4ID0gZkRhdGEoYXJhYmlkcG9zaXNfY28zcmVwMSkkdGFnbS5tY21jLm1lYW4uc2hhbm5vbiwNCiAgICAgICAgbWFpbiA9ICJWaXN1YWxpc2luZyBnbG9iYWwgdW5jZXJ0YWludHkiKQ0KYWRkTGVnZW5kKGFyYWJpZHBvc2lzX2NvM3JlcDEsIGZjb2wgPSAibWFya2VyczIiLA0KICAgICAgICAgICB3aGVyZSA9ICJ0b3BsZWZ0IiwgbmNvbCA9IDIsIGNleCA9IDAuNikNCg0KYGBgDQoNCmBgYHtyLH0NCnNhdmUoYXJhYl9jbzNyZXAxX21hcmtlcjJfcGFyYW1zX3Bvb2xlZCwgZmlsZSA9ICJhcmFiX2NvM3JlcDFfbWFya2VyMl9wYXJhbXNfcG9vbGVkLnJkYSIpDQpzYXZlKGFyYWJpZHBvc2lzX2NvM3JlcDEsIGZpbGUgPSAiYXJhYmlkcG9zaXNfY28zcmVwMV9tYXJrZXJzMl90YWdtLnJkYSIpDQpgYGANCg0KIyBjbzMgcmVwMiANCg0KYGBge3IsfQ0KbG9hZCgiQzovVXNlcnMvT2xseUMvRGVza3RvcC8yMDE5LUxPUElULVByb2plY3RzLzIwMjAtSGFycmlldC1BcmFiaWRvcHNpcy0vUmF3RGF0YS9hcmFiaWRwb3Npc19jbzNyZXAyLnJkYSIpDQphcmFiX2NvM3JlcDJfcGFyYW1zIDwtIHJlYWRSRFMoZmlsZSA9ICJDOi9Vc2Vycy9PbGx5Qy9EZXNrdG9wLzIwMTktTE9QSVQtUHJvamVjdHMvMjAyMC1IYXJyaWV0LUFyYWJpZG9wc2lzLS9SYXdEYXRhL21jbWNfYXJhYmlkcG9zaXNfY28zcmVwMi5yZHMiKQ0KYGBgDQoNCiNpbnRpYWwgdmlzdWFsaXNhdGlvbg0KYGBge3IsfQ0KZkRhdGEoYXJhYmlkcG9zaXNfY28zcmVwMikkbWFya2Vyc1tmRGF0YShhcmFiaWRwb3Npc19jbzNyZXAyKSRtYXJrZXJzICVpbiUgYygiY3l0b3NvbGljIHJpYm9zb21lcyIsICJleHRyYWNlbGx1bGFyIildIDwtICJ1bmtub3duIg0KcGxvdDJEKGFyYWJpZHBvc2lzX2NvM3JlcDIsIGdyaWQgPSBGQUxTRSwgZmNvbCA9ICJtYXJrZXJzIikNCmFkZExlZ2VuZChhcmFiaWRwb3Npc19jbzNyZXAyLCB3aGVyZSA9ICJ0b3BsZWZ0IiwgY2V4ID0gMC43LCBuY29sID0gMiwgZmNvbCA9ICJtYXJrZXJzIikNCmBgYA0KYGBge3IsfQ0Kb3V0IDwtIG1jbWNfZ2V0X291dGxpZXJzKGFyYWJfY28zcmVwMl9wYXJhbXMpDQoNCmBgYA0KDQoNCmBgYHtyLH0NCm5DaGFpbnMgPC0gbGVuZ3RoKGFyYWJfY28zcmVwMl9wYXJhbXMpDQpuQ2hhaW5zDQpmb3IgKGkgaW4gc2VxX2xlbihuQ2hhaW5zKSkNCiAgICBwbG90KG91dFtbaV1dLCBtYWluID0gcGFzdGUoIkNoYWluIiwgaSksIGF1dG8ubGF5b3V0ID0gRkFMU0UsIGNvbCA9IGkpDQoNCmBgYA0KYGBge3IsfQ0KZ2VsbWFuLmRpYWcob3V0W2MoMSwyKV0sIHRyYW5zZm9ybSA9IEZBTFNFKQ0KDQpgYGANCmBgYHtyLH0NCmFyYWJfY28zcmVwMl9wYXJhbXNfcG9vbGVkIDwtIG1jbWNfcG9vbF9jaGFpbnMoYXJhYl9jbzNyZXAyX3BhcmFtc1tjKDEsMildKQ0KYXJhYl9jbzNyZXAyX3BhcmFtc19wb29sZWQNCg0KYGBgDQoNCg0KYGBge3IsfQ0KYXJhYl9jbzNyZXAyX3BhcmFtc19wb29sZWQgPC0gdGFnbU1jbWNQcm9jZXNzKGFyYWJfY28zcmVwMl9wYXJhbXNfcG9vbGVkKQ0KYXJhYl9jbzNyZXAyX3BhcmFtc19wb29sZWQNCg0KYGBgDQoNCg0KYGBge3IsfQ0KYXJhYmlkcG9zaXNfY28zcmVwMiA8LSB0YWdtUHJlZGljdChvYmplY3QgPSBhcmFiaWRwb3Npc19jbzNyZXAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gYXJhYl9jbzNyZXAyX3BhcmFtc19wb29sZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iSm9pbnQgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNvbCA9ICJtYXJrZXJzIikNCmhlYWQoZkRhdGEoYXJhYmlkcG9zaXNfY28zcmVwMikpDQoNCmBgYA0KDQpgYGB7cix9DQpwYXIobWZyb3cgPSBjKDEsIDIpKQ0KcGxvdDJEKGFyYWJpZHBvc2lzX2NvM3JlcDIsIGZjb2wgPSAidGFnbS5tY21jLmFsbG9jYXRpb24iLA0KICAgICAgICBjZXggPSBmRGF0YShhcmFiaWRwb3Npc19jbzNyZXAyKSR0YWdtLm1jbWMucHJvYmFiaWxpdHksDQogICAgICAgIG1haW4gPSAiVEFHTSBNQ01DIGFsbG9jYXRpb25zIikNCmFkZExlZ2VuZChhcmFiaWRwb3Npc19jbzNyZXAyLCBmY29sID0gIm1hcmtlcnMiLA0KICAgICAgICAgICB3aGVyZSA9ICJ0b3BsZWZ0IiwgbmNvbCA9IDIsIGNleCA9IDAuNikNCg0KcGxvdDJEKGFyYWJpZHBvc2lzX2NvM3JlcDIsIGZjb2wgPSAidGFnbS5tY21jLmFsbG9jYXRpb24iLA0KICAgICAgICBjZXggPSBmRGF0YShhcmFiaWRwb3Npc19jbzNyZXAyKSR0YWdtLm1jbWMubWVhbi5zaGFubm9uLA0KICAgICAgICBtYWluID0gIlZpc3VhbGlzaW5nIGdsb2JhbCB1bmNlcnRhaW50eSIpDQphZGRMZWdlbmQoYXJhYmlkcG9zaXNfY28zcmVwMiwgZmNvbCA9ICJtYXJrZXJzIiwNCiAgICAgICAgICAgd2hlcmUgPSAidG9wbGVmdCIsIG5jb2wgPSAyLCBjZXggPSAwLjYpDQoNCmBgYA0KDQpgYGB7cix9DQpzYXZlKGFyYWJfY28zcmVwMl9wYXJhbXNfcG9vbGVkLCBmaWxlID0gImFyYWJfY28zcmVwMl9wYXJhbXNfcG9vbGVkLnJkYSIpDQpzYXZlKGFyYWJpZHBvc2lzX2NvM3JlcDIsIGZpbGUgPSAiYXJhYmlkcG9zaXNfY28zcmVwMl90YWdtLnJkYSIpDQpgYGANCg0KDQojIENPMyByZXAgMiBtYXJrZXJzMg0KDQpgYGB7cix9DQpsb2FkKCJDOi9Vc2Vycy9PbGx5Qy9EZXNrdG9wLzIwMTktTE9QSVQtUHJvamVjdHMvMjAyMC1IYXJyaWV0LUFyYWJpZG9wc2lzLS9SYXdEYXRhL2FyYWJpZHBvc2lzX2NvM3JlcDIucmRhIikNCmFyYWJfY28zcmVwMl9tYXJrZXJzMl9wYXJhbXMgPC0gcmVhZFJEUyhmaWxlID0gIkM6L1VzZXJzL09sbHlDL0Rlc2t0b3AvMjAxOS1MT1BJVC1Qcm9qZWN0cy8yMDIwLUhhcnJpZXQtQXJhYmlkb3BzaXMtL1Jhd0RhdGEvbWNtY19hcmFiaWRwb3Npc19jbzNyZXAyX21hcmtlcnMyLnJkcyIpDQpgYGANCg0KI2ludGlhbCB2aXN1YWxpc2F0aW9uDQpgYGB7cix9DQpmRGF0YShhcmFiaWRwb3Npc19jbzNyZXAyKSRtYXJrZXJzMltmRGF0YShhcmFiaWRwb3Npc19jbzNyZXAyKSRtYXJrZXJzMiAlaW4lIGMoImN5dG9zb2xpYyByaWJvc29tZXMiLCAiZXh0cmFjZWxsdWxhciIpXSA8LSAidW5rbm93biINCnBsb3QyRChhcmFiaWRwb3Npc19jbzNyZXAyLCBncmlkID0gRkFMU0UsIGZjb2wgPSAibWFya2VyczIiKQ0KYWRkTGVnZW5kKGFyYWJpZHBvc2lzX2NvM3JlcDIsIHdoZXJlID0gInRvcGxlZnQiLCBjZXggPSAwLjcsIG5jb2wgPSAyLCBmY29sID0gIm1hcmtlcnMyIikNCmBgYA0KYGBge3IsfQ0Kb3V0IDwtIG1jbWNfZ2V0X291dGxpZXJzKGFyYWJfY28zcmVwMl9tYXJrZXJzMl9wYXJhbXMpDQoNCmBgYA0KDQoNCmBgYHtyLH0NCm5DaGFpbnMgPC0gbGVuZ3RoKGFyYWJfY28zcmVwMl9tYXJrZXJzMl9wYXJhbXMpDQpuQ2hhaW5zDQpmb3IgKGkgaW4gc2VxX2xlbihuQ2hhaW5zKSkNCiAgICBwbG90KG91dFtbaV1dLCBtYWluID0gcGFzdGUoIkNoYWluIiwgaSksIGF1dG8ubGF5b3V0ID0gRkFMU0UsIGNvbCA9IGkpDQoNCmBgYA0KYGBge3IsfQ0KZ2VsbWFuLmRpYWcob3V0W2MoMiwzKV0sIHRyYW5zZm9ybSA9IEZBTFNFKQ0KDQpgYGANCmBgYHtyLH0NCmFyYWJfY28zcmVwMl9tYXJrZXJzMl9wYXJhbXNfcG9vbGVkIDwtIG1jbWNfcG9vbF9jaGFpbnMoYXJhYl9jbzNyZXAyX21hcmtlcnMyX3BhcmFtc1tjKDIsMyldKQ0KYXJhYl9jbzNyZXAyX21hcmtlcnMyX3BhcmFtc19wb29sZWQNCg0KYGBgDQoNCg0KYGBge3IsfQ0KYXJhYl9jbzNyZXAyX21hcmtlcnMyX3BhcmFtc19wb29sZWQgPC0gdGFnbU1jbWNQcm9jZXNzKGFyYWJfY28zcmVwMl9tYXJrZXJzMl9wYXJhbXNfcG9vbGVkKQ0KYXJhYl9jbzNyZXAyX21hcmtlcnMyX3BhcmFtc19wb29sZWQNCg0KYGBgDQoNCg0KYGBge3IsfQ0KYXJhYmlkcG9zaXNfY28zcmVwMiA8LSB0YWdtUHJlZGljdChvYmplY3QgPSBhcmFiaWRwb3Npc19jbzNyZXAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gYXJhYl9jbzNyZXAyX21hcmtlcnMyX3BhcmFtc19wb29sZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iSm9pbnQgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNvbCA9ICJtYXJrZXJzMiIpDQpoZWFkKGZEYXRhKGFyYWJpZHBvc2lzX2NvM3JlcDIpKQ0KDQpgYGANCg0KYGBge3IsfQ0KcGFyKG1mcm93ID0gYygxLCAyKSkNCnBsb3QyRChhcmFiaWRwb3Npc19jbzNyZXAyLCBmY29sID0gInRhZ20ubWNtYy5hbGxvY2F0aW9uIiwNCiAgICAgICAgY2V4ID0gZkRhdGEoYXJhYmlkcG9zaXNfY28zcmVwMikkdGFnbS5tY21jLnByb2JhYmlsaXR5LA0KICAgICAgICBtYWluID0gIlRBR00gTUNNQyBhbGxvY2F0aW9ucyIpDQphZGRMZWdlbmQoYXJhYmlkcG9zaXNfY28zcmVwMiwgZmNvbCA9ICJtYXJrZXJzMiIsDQogICAgICAgICAgIHdoZXJlID0gInRvcGxlZnQiLCBuY29sID0gMiwgY2V4ID0gMC42KQ0KDQpwbG90MkQoYXJhYmlkcG9zaXNfY28zcmVwMiwgZmNvbCA9ICJ0YWdtLm1jbWMuYWxsb2NhdGlvbiIsDQogICAgICAgIGNleCA9IGZEYXRhKGFyYWJpZHBvc2lzX2NvM3JlcDIpJHRhZ20ubWNtYy5tZWFuLnNoYW5ub24sDQogICAgICAgIG1haW4gPSAiVmlzdWFsaXNpbmcgZ2xvYmFsIHVuY2VydGFpbnR5IikNCmFkZExlZ2VuZChhcmFiaWRwb3Npc19jbzNyZXAyLCBmY29sID0gIm1hcmtlcnMyIiwNCiAgICAgICAgICAgd2hlcmUgPSAidG9wbGVmdCIsIG5jb2wgPSAyLCBjZXggPSAwLjYpDQoNCmBgYA0KDQpgYGB7cix9DQpzYXZlKGFyYWJfY28zcmVwMl9tYXJrZXJzMl9wYXJhbXNfcG9vbGVkLCBmaWxlID0gImFyYWJfY28zcmVwMl9tYXJrZXJzMl9wYXJhbXNfcG9vbGVkLnJkYSIpDQpzYXZlKGFyYWJpZHBvc2lzX2NvM3JlcDIsIGZpbGUgPSAiYXJhYmlkcG9zaXNfY28zcmVwMl9tYXJrZXJzMl90YWdtLnJkYSIpDQpgYGANCg0KDQojIENPMyByZXAgMw0KDQpgYGB7cix9DQpsb2FkKCJDOi9Vc2Vycy9PbGx5Qy9EZXNrdG9wLzIwMTktTE9QSVQtUHJvamVjdHMvMjAyMC1IYXJyaWV0LUFyYWJpZG9wc2lzLS9SYXdEYXRhL2FyYWJpZHBvc2lzX2NvM3JlcDMucmRhIikNCmFyYWJfY28zcmVwM19wYXJhbXMgPC0gcmVhZFJEUyhmaWxlID0gIkM6L1VzZXJzL09sbHlDL0Rlc2t0b3AvMjAxOS1MT1BJVC1Qcm9qZWN0cy8yMDIwLUhhcnJpZXQtQXJhYmlkb3BzaXMtL1Jhd0RhdGEvbWNtY19hcmFiaWRwb3Npc19jbzNyZXAzLnJkcyIpDQpgYGANCg0KI2ludGlhbCB2aXN1YWxpc2F0aW9uDQpgYGB7cix9DQpmRGF0YShhcmFiaWRwb3Npc19jbzNyZXAzKSRtYXJrZXJzW2ZEYXRhKGFyYWJpZHBvc2lzX2NvM3JlcDMpJG1hcmtlcnMgJWluJSBjKCJjeXRvc29saWMgcmlib3NvbWVzIiwgImV4dHJhY2VsbHVsYXIiKV0gPC0gInVua25vd24iDQpwbG90MkQoYXJhYmlkcG9zaXNfY28zcmVwMywgZ3JpZCA9IEZBTFNFLCBmY29sID0gIm1hcmtlcnMiKQ0KYWRkTGVnZW5kKGFyYWJpZHBvc2lzX2NvM3JlcDMsIHdoZXJlID0gInRvcGxlZnQiLCBjZXggPSAwLjcsIG5jb2wgPSAyLCBmY29sID0gIm1hcmtlcnMiKQ0KYGBgDQpgYGB7cix9DQpvdXQgPC0gbWNtY19nZXRfb3V0bGllcnMoYXJhYl9jbzNyZXAzX3BhcmFtcykNCg0KYGBgDQoNCg0KYGBge3IsfQ0KbkNoYWlucyA8LSBsZW5ndGgoYXJhYl9jbzNyZXAzX3BhcmFtcykNCm5DaGFpbnMNCmZvciAoaSBpbiBzZXFfbGVuKG5DaGFpbnMpKQ0KICAgIHBsb3Qob3V0W1tpXV0sIG1haW4gPSBwYXN0ZSgiQ2hhaW4iLCBpKSwgYXV0by5sYXlvdXQgPSBGQUxTRSwgY29sID0gaSkNCg0KYGBgDQpgYGB7cix9DQpnZWxtYW4uZGlhZyhvdXRbYygyLDMpXSwgdHJhbnNmb3JtID0gRkFMU0UpDQoNCmBgYA0KYGBge3IsfQ0KYXJhYl9jbzNyZXAzX3BhcmFtc19wb29sZWQgPC0gbWNtY19wb29sX2NoYWlucyhhcmFiX2NvM3JlcDNfcGFyYW1zW2MoMiwzKV0pDQphcmFiX2NvM3JlcDNfcGFyYW1zX3Bvb2xlZA0KDQpgYGANCg0KDQpgYGB7cix9DQphcmFiX2NvM3JlcDNfcGFyYW1zX3Bvb2xlZCA8LSB0YWdtTWNtY1Byb2Nlc3MoYXJhYl9jbzNyZXAzX3BhcmFtc19wb29sZWQpDQphcmFiX2NvM3JlcDNfcGFyYW1zX3Bvb2xlZA0KDQpgYGANCg0KDQpgYGB7cix9DQphcmFiaWRwb3Npc19jbzNyZXAzIDwtIHRhZ21QcmVkaWN0KG9iamVjdCA9IGFyYWJpZHBvc2lzX2NvM3JlcDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSBhcmFiX2NvM3JlcDNfcGFyYW1zX3Bvb2xlZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JKb2ludCA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBmY29sID0gIm1hcmtlcnMiKQ0KaGVhZChmRGF0YShhcmFiaWRwb3Npc19jbzNyZXAzKSkNCg0KYGBgDQoNCmBgYHtyLH0NCnBhcihtZnJvdyA9IGMoMSwgMikpDQpwbG90MkQoYXJhYmlkcG9zaXNfY28zcmVwMywgZmNvbCA9ICJ0YWdtLm1jbWMuYWxsb2NhdGlvbiIsDQogICAgICAgIGNleCA9IGZEYXRhKGFyYWJpZHBvc2lzX2NvM3JlcDMpJHRhZ20ubWNtYy5wcm9iYWJpbGl0eSwNCiAgICAgICAgbWFpbiA9ICJUQUdNIE1DTUMgYWxsb2NhdGlvbnMiKQ0KYWRkTGVnZW5kKGFyYWJpZHBvc2lzX2NvM3JlcDMsIGZjb2wgPSAibWFya2VycyIsDQogICAgICAgICAgIHdoZXJlID0gInRvcGxlZnQiLCBuY29sID0gMiwgY2V4ID0gMC42KQ0KDQpwbG90MkQoYXJhYmlkcG9zaXNfY28zcmVwMywgZmNvbCA9ICJ0YWdtLm1jbWMuYWxsb2NhdGlvbiIsDQogICAgICAgIGNleCA9IGZEYXRhKGFyYWJpZHBvc2lzX2NvM3JlcDMpJHRhZ20ubWNtYy5tZWFuLnNoYW5ub24sDQogICAgICAgIG1haW4gPSAiVmlzdWFsaXNpbmcgZ2xvYmFsIHVuY2VydGFpbnR5IikNCmFkZExlZ2VuZChhcmFiaWRwb3Npc19jbzNyZXAyLCBmY29sID0gIm1hcmtlcnMiLA0KICAgICAgICAgICB3aGVyZSA9ICJ0b3BsZWZ0IiwgbmNvbCA9IDIsIGNleCA9IDAuNikNCg0KYGBgDQoNCmBgYHtyLH0NCnNhdmUoYXJhYl9jbzNyZXAzX3BhcmFtc19wb29sZWQsIGZpbGUgPSAiYXJhYl9jbzNyZXAzX3BhcmFtc19wb29sZWQucmRhIikNCnNhdmUoYXJhYmlkcG9zaXNfY28zcmVwMywgZmlsZSA9ICJhcmFiaWRwb3Npc19jbzNyZXAzX3RhZ20ucmRhIikNCmBgYA0KDQojIENvMyByZXAzIG1hcmtlcnMgMg0KYGBge3IsfQ0KbG9hZCgiQzovVXNlcnMvT2xseUMvRGVza3RvcC8yMDE5LUxPUElULVByb2plY3RzLzIwMjAtSGFycmlldC1BcmFiaWRvcHNpcy0vUmF3RGF0YS9hcmFiaWRwb3Npc19jbzNyZXAzLnJkYSIpDQphcmFiX2NvM3JlcDNfbWFya2VyczJfcGFyYW1zIDwtIHJlYWRSRFMoZmlsZSA9ICJDOi9Vc2Vycy9PbGx5Qy9EZXNrdG9wLzIwMTktTE9QSVQtUHJvamVjdHMvMjAyMC1IYXJyaWV0LUFyYWJpZG9wc2lzLS9SYXdEYXRhL21jbWNfYXJhYmlkcG9zaXNfY28zcmVwM19tYXJrZXJzMi5yZHMiKQ0KYGBgDQoNCiNpbnRpYWwgdmlzdWFsaXNhdGlvbg0KYGBge3IsfQ0KZkRhdGEoYXJhYmlkcG9zaXNfY28zcmVwMykkbWFya2VyczJbZkRhdGEoYXJhYmlkcG9zaXNfY28zcmVwMykkbWFya2VyczIgJWluJSBjKCJjeXRvc29saWMgcmlib3NvbWVzIiwgImV4dHJhY2VsbHVsYXIiKV0gPC0gInVua25vd24iDQpwbG90MkQoYXJhYmlkcG9zaXNfY28zcmVwMywgZ3JpZCA9IEZBTFNFLCBmY29sID0gIm1hcmtlcnMyIikNCmFkZExlZ2VuZChhcmFiaWRwb3Npc19jbzNyZXAzLCB3aGVyZSA9ICJ0b3BsZWZ0IiwgY2V4ID0gMC43LCBuY29sID0gMiwgZmNvbCA9ICJtYXJrZXJzMiIpDQpgYGANCmBgYHtyLH0NCm91dCA8LSBtY21jX2dldF9vdXRsaWVycyhhcmFiX2NvM3JlcDNfbWFya2VyczJfcGFyYW1zKQ0KDQpgYGANCg0KDQpgYGB7cix9DQpuQ2hhaW5zIDwtIGxlbmd0aChhcmFiX2NvM3JlcDNfbWFya2VyczJfcGFyYW1zKQ0KbkNoYWlucw0KZm9yIChpIGluIHNlcV9sZW4obkNoYWlucykpDQogICAgcGxvdChvdXRbW2ldXSwgbWFpbiA9IHBhc3RlKCJDaGFpbiIsIGkpLCBhdXRvLmxheW91dCA9IEZBTFNFLCBjb2wgPSBpKQ0KDQpgYGANCmBgYHtyLH0NCmdlbG1hbi5kaWFnKG91dFtjKDIsMyldLCB0cmFuc2Zvcm0gPSBGQUxTRSkNCg0KYGBgDQpgYGB7cix9DQphcmFiX2NvM3JlcDNfbWFya2VyczJfcGFyYW1zX3Bvb2xlZCA8LSBtY21jX3Bvb2xfY2hhaW5zKGFyYWJfY28zcmVwM19tYXJrZXJzMl9wYXJhbXNbYygyLDMpXSkNCmFyYWJfY28zcmVwM19tYXJrZXJzMl9wYXJhbXNfcG9vbGVkDQoNCmBgYA0KDQoNCmBgYHtyLH0NCmFyYWJfY28zcmVwM19tYXJrZXJzMl9wYXJhbXNfcG9vbGVkIDwtIHRhZ21NY21jUHJvY2VzcyhhcmFiX2NvM3JlcDNfbWFya2VyczJfcGFyYW1zX3Bvb2xlZCkNCmFyYWJfY28zcmVwM19tYXJrZXJzMl9wYXJhbXNfcG9vbGVkDQoNCmBgYA0KDQoNCmBgYHtyLH0NCmFyYWJpZHBvc2lzX2NvM3JlcDMgPC0gdGFnbVByZWRpY3Qob2JqZWN0ID0gYXJhYmlkcG9zaXNfY28zcmVwMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IGFyYWJfY28zcmVwM19tYXJrZXJzMl9wYXJhbXNfcG9vbGVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYkpvaW50ID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZjb2wgPSAibWFya2VyczIiKQ0KaGVhZChmRGF0YShhcmFiaWRwb3Npc19jbzNyZXAzKSkNCg0KYGBgDQoNCmBgYHtyLH0NCnBhcihtZnJvdyA9IGMoMSwgMikpDQpwbG90MkQoYXJhYmlkcG9zaXNfY28zcmVwMywgZmNvbCA9ICJ0YWdtLm1jbWMuYWxsb2NhdGlvbiIsDQogICAgICAgIGNleCA9IGZEYXRhKGFyYWJpZHBvc2lzX2NvM3JlcDMpJHRhZ20ubWNtYy5wcm9iYWJpbGl0eSwNCiAgICAgICAgbWFpbiA9ICJUQUdNIE1DTUMgYWxsb2NhdGlvbnMiKQ0KYWRkTGVnZW5kKGFyYWJpZHBvc2lzX2NvM3JlcDMsIGZjb2wgPSAibWFya2VyczIiLA0KICAgICAgICAgICB3aGVyZSA9ICJ0b3BsZWZ0IiwgbmNvbCA9IDIsIGNleCA9IDAuNikNCg0KcGxvdDJEKGFyYWJpZHBvc2lzX2NvM3JlcDMsIGZjb2wgPSAidGFnbS5tY21jLmFsbG9jYXRpb24iLA0KICAgICAgICBjZXggPSBmRGF0YShhcmFiaWRwb3Npc19jbzNyZXAzKSR0YWdtLm1jbWMubWVhbi5zaGFubm9uLA0KICAgICAgICBtYWluID0gIlZpc3VhbGlzaW5nIGdsb2JhbCB1bmNlcnRhaW50eSIpDQphZGRMZWdlbmQoYXJhYmlkcG9zaXNfY28zcmVwMiwgZmNvbCA9ICJtYXJrZXJzMiIsDQogICAgICAgICAgIHdoZXJlID0gInRvcGxlZnQiLCBuY29sID0gMiwgY2V4ID0gMC42KQ0KDQpgYGANCg0KYGBge3IsfQ0Kc2F2ZSggYXJhYl9jbzNyZXAzX21hcmtlcnMyX3BhcmFtc19wb29sZWQsIGZpbGUgPSAiIGFyYWJfY28zcmVwM19tYXJrZXJzMl9wYXJhbXNfcG9vbGVkLnJkYSIpDQpzYXZlKGFyYWJpZHBvc2lzX2NvM3JlcDMsIGZpbGUgPSAiYXJhYmlkcG9zaXNfY28zcmVwM19tYXJrZXJzMl90YWdtLnJkYSIpDQpgYGANCg0KIyBjbzMgcmVwIDQNCg0KYGBge3IsfQ0KbG9hZCgiQzovVXNlcnMvT2xseUMvRGVza3RvcC8yMDE5LUxPUElULVByb2plY3RzLzIwMjAtSGFycmlldC1BcmFiaWRvcHNpcy0vUmF3RGF0YS9hcmFiaWRwb3Npc19jbzNyZXA0LnJkYSIpDQphcmFiX2NvM3JlcDRfcGFyYW1zIDwtIHJlYWRSRFMoZmlsZSA9ICJDOi9Vc2Vycy9PbGx5Qy9EZXNrdG9wLzIwMTktTE9QSVQtUHJvamVjdHMvMjAyMC1IYXJyaWV0LUFyYWJpZG9wc2lzLS9SYXdEYXRhL21jbWNfYXJhYmlkcG9zaXNfY28zcmVwNC5yZHMiKQ0KYGBgDQoNCiNpbnRpYWwgdmlzdWFsaXNhdGlvbg0KYGBge3IsfQ0KZkRhdGEoYXJhYmlkcG9zaXNfY28zcmVwNCkkbWFya2Vyc1tmRGF0YShhcmFiaWRwb3Npc19jbzNyZXA0KSRtYXJrZXJzICVpbiUgYygiY3l0b3NvbGljIHJpYm9zb21lcyIsICJleHRyYWNlbGx1bGFyIildIDwtICJ1bmtub3duIg0KcGxvdDJEKGFyYWJpZHBvc2lzX2NvM3JlcDQsIGdyaWQgPSBGQUxTRSwgZmNvbCA9ICJtYXJrZXJzIikNCmFkZExlZ2VuZChhcmFiaWRwb3Npc19jbzNyZXA0LCB3aGVyZSA9ICJ0b3BsZWZ0IiwgY2V4ID0gMC43LCBuY29sID0gMiwgZmNvbCA9ICJtYXJrZXJzIikNCmBgYA0KYGBge3IsfQ0Kb3V0IDwtIG1jbWNfZ2V0X291dGxpZXJzKGFyYWJfY28zcmVwNF9wYXJhbXMpDQoNCmBgYA0KDQoNCmBgYHtyLH0NCm5DaGFpbnMgPC0gbGVuZ3RoKGFyYWJfY28zcmVwNF9wYXJhbXMpDQpuQ2hhaW5zDQpmb3IgKGkgaW4gc2VxX2xlbihuQ2hhaW5zKSkNCiAgICBwbG90KG91dFtbaV1dLCBtYWluID0gcGFzdGUoIkNoYWluIiwgaSksIGF1dG8ubGF5b3V0ID0gRkFMU0UsIGNvbCA9IGkpDQoNCmBgYA0KYGBge3IsfQ0KZ2VsbWFuLmRpYWcob3V0W2MoMSwyKV0sIHRyYW5zZm9ybSA9IEZBTFNFKQ0KDQpgYGANCmBgYHtyLH0NCmFyYWJfY28zcmVwNF9wYXJhbXNfcG9vbGVkIDwtIG1jbWNfcG9vbF9jaGFpbnMoYXJhYl9jbzNyZXA0X3BhcmFtc1tjKDEsMildKQ0KYXJhYl9jbzNyZXA0X3BhcmFtc19wb29sZWQNCg0KYGBgDQoNCg0KYGBge3IsfQ0KYXJhYl9jbzNyZXA0X3BhcmFtc19wb29sZWQgPC0gdGFnbU1jbWNQcm9jZXNzKGFyYWJfY28zcmVwNF9wYXJhbXNfcG9vbGVkKQ0KYXJhYl9jbzNyZXA0X3BhcmFtc19wb29sZWQNCg0KYGBgDQoNCg0KYGBge3IsfQ0KYXJhYmlkcG9zaXNfY28zcmVwNCA8LSB0YWdtUHJlZGljdChvYmplY3QgPSBhcmFiaWRwb3Npc19jbzNyZXA0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gYXJhYl9jbzNyZXA0X3BhcmFtc19wb29sZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iSm9pbnQgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNvbCA9ICJtYXJrZXJzIikNCmhlYWQoZkRhdGEoYXJhYmlkcG9zaXNfY28zcmVwNCkpDQoNCmBgYA0KDQpgYGB7cix9DQpwYXIobWZyb3cgPSBjKDEsIDIpKQ0KcGxvdDJEKGFyYWJpZHBvc2lzX2NvM3JlcDQsIGZjb2wgPSAidGFnbS5tY21jLmFsbG9jYXRpb24iLA0KICAgICAgICBjZXggPSBmRGF0YShhcmFiaWRwb3Npc19jbzNyZXA0KSR0YWdtLm1jbWMucHJvYmFiaWxpdHksDQogICAgICAgIG1haW4gPSAiVEFHTSBNQ01DIGFsbG9jYXRpb25zIikNCmFkZExlZ2VuZChhcmFiaWRwb3Npc19jbzNyZXA0LCBmY29sID0gIm1hcmtlcnMiLA0KICAgICAgICAgICB3aGVyZSA9ICJ0b3BsZWZ0IiwgbmNvbCA9IDIsIGNleCA9IDAuNikNCg0KcGxvdDJEKGFyYWJpZHBvc2lzX2NvM3JlcDQsIGZjb2wgPSAidGFnbS5tY21jLmFsbG9jYXRpb24iLA0KICAgICAgICBjZXggPSBmRGF0YShhcmFiaWRwb3Npc19jbzNyZXA0KSR0YWdtLm1jbWMubWVhbi5zaGFubm9uLA0KICAgICAgICBtYWluID0gIlZpc3VhbGlzaW5nIGdsb2JhbCB1bmNlcnRhaW50eSIpDQphZGRMZWdlbmQoYXJhYmlkcG9zaXNfY28zcmVwNCwgZmNvbCA9ICJtYXJrZXJzIiwNCiAgICAgICAgICAgd2hlcmUgPSAidG9wbGVmdCIsIG5jb2wgPSAyLCBjZXggPSAwLjYpDQoNCmBgYA0KDQpgYGB7cix9DQpzYXZlKCBhcmFiX2NvM3JlcDRfcGFyYW1zX3Bvb2xlZCwgZmlsZSA9ICIgYXJhYl9jbzNyZXA0X3BhcmFtc19wb29sZWQucmRhIikNCnNhdmUoYXJhYmlkcG9zaXNfY28zcmVwNCwgZmlsZSA9ICJhcmFiaWRwb3Npc19jbzNyZXA0X3RhZ20ucmRhIikNCmBgYA0KDQoNCiMgQ28zIHJlcCA0IG1hcmtlcnMgMg0KDQpgYGB7cix9DQpsb2FkKCJDOi9Vc2Vycy9PbGx5Qy9EZXNrdG9wLzIwMTktTE9QSVQtUHJvamVjdHMvMjAyMC1IYXJyaWV0LUFyYWJpZG9wc2lzLS9SYXdEYXRhL2FyYWJpZHBvc2lzX2NvM3JlcDQucmRhIikNCmFyYWJfY28zcmVwNF9tYXJrZXJzMl9wYXJhbXMgPC0gcmVhZFJEUyhmaWxlID0gIkM6L1VzZXJzL09sbHlDL0Rlc2t0b3AvMjAxOS1MT1BJVC1Qcm9qZWN0cy8yMDIwLUhhcnJpZXQtQXJhYmlkb3BzaXMtL1Jhd0RhdGEvbWNtY19hcmFiaWRwb3Npc19jbzNyZXA0X21hcmtlcnMyLnJkcyIpDQpgYGANCg0KI2ludGlhbCB2aXN1YWxpc2F0aW9uDQpgYGB7cix9DQpmRGF0YShhcmFiaWRwb3Npc19jbzNyZXA0KSRtYXJrZXJzMltmRGF0YShhcmFiaWRwb3Npc19jbzNyZXA0KSRtYXJrZXJzMiAlaW4lIGMoImN5dG9zb2xpYyByaWJvc29tZXMiLCAiZXh0cmFjZWxsdWxhciIpXSA8LSAidW5rbm93biINCnBsb3QyRChhcmFiaWRwb3Npc19jbzNyZXA0LCBncmlkID0gRkFMU0UsIGZjb2wgPSAibWFya2VyczIiKQ0KYWRkTGVnZW5kKGFyYWJpZHBvc2lzX2NvM3JlcDQsIHdoZXJlID0gInRvcGxlZnQiLCBjZXggPSAwLjcsIG5jb2wgPSAyLCBmY29sID0gIm1hcmtlcnMyIikNCmBgYA0KYGBge3IsfQ0Kb3V0IDwtIG1jbWNfZ2V0X291dGxpZXJzKGFyYWJfY28zcmVwNF9tYXJrZXJzMl9wYXJhbXMpDQoNCmBgYA0KDQoNCmBgYHtyLH0NCm5DaGFpbnMgPC0gbGVuZ3RoKGFyYWJfY28zcmVwNF9tYXJrZXJzMl9wYXJhbXMpDQpuQ2hhaW5zDQpmb3IgKGkgaW4gc2VxX2xlbihuQ2hhaW5zKSkNCiAgICBwbG90KG91dFtbaV1dLCBtYWluID0gcGFzdGUoIkNoYWluIiwgaSksIGF1dG8ubGF5b3V0ID0gRkFMU0UsIGNvbCA9IGkpDQoNCmBgYA0KYGBge3IsfQ0KZ2VsbWFuLmRpYWcob3V0W2MoMiwzLDQpXSwgdHJhbnNmb3JtID0gRkFMU0UpDQoNCmBgYA0KYGBge3IsfQ0KYXJhYl9jbzNyZXA0X21hcmtlcnMyX3BhcmFtc19wb29sZWQgPC0gbWNtY19wb29sX2NoYWlucyhhcmFiX2NvM3JlcDRfbWFya2VyczJfcGFyYW1zW2MoMiwzLDQpXSkNCmFyYWJfY28zcmVwNF9tYXJrZXJzMl9wYXJhbXNfcG9vbGVkDQoNCmBgYA0KDQoNCmBgYHtyLH0NCmFyYWJfY28zcmVwNF9tYXJrZXJzMl9wYXJhbXNfcG9vbGVkIDwtIHRhZ21NY21jUHJvY2VzcyhhcmFiX2NvM3JlcDRfbWFya2VyczJfcGFyYW1zX3Bvb2xlZCkNCmFyYWJfY28zcmVwNF9tYXJrZXJzMl9wYXJhbXNfcG9vbGVkDQoNCmBgYA0KDQoNCmBgYHtyLH0NCmFyYWJpZHBvc2lzX2NvM3JlcDQgPC0gdGFnbVByZWRpY3Qob2JqZWN0ID0gYXJhYmlkcG9zaXNfY28zcmVwNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IGFyYWJfY28zcmVwNF9tYXJrZXJzMl9wYXJhbXNfcG9vbGVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYkpvaW50ID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZjb2wgPSAibWFya2VyczIiKQ0KaGVhZChmRGF0YShhcmFiaWRwb3Npc19jbzNyZXA0KSkNCg0KYGBgDQoNCmBgYHtyLH0NCnBhcihtZnJvdyA9IGMoMSwgMikpDQpwbG90MkQoYXJhYmlkcG9zaXNfY28zcmVwNCwgZmNvbCA9ICJ0YWdtLm1jbWMuYWxsb2NhdGlvbiIsDQogICAgICAgIGNleCA9IGZEYXRhKGFyYWJpZHBvc2lzX2NvM3JlcDQpJHRhZ20ubWNtYy5wcm9iYWJpbGl0eSwNCiAgICAgICAgbWFpbiA9ICJUQUdNIE1DTUMgYWxsb2NhdGlvbnMiKQ0KYWRkTGVnZW5kKGFyYWJpZHBvc2lzX2NvM3JlcDQsIGZjb2wgPSAibWFya2VyczIiLA0KICAgICAgICAgICB3aGVyZSA9ICJ0b3BsZWZ0IiwgbmNvbCA9IDIsIGNleCA9IDAuNikNCg0KcGxvdDJEKGFyYWJpZHBvc2lzX2NvM3JlcDQsIGZjb2wgPSAidGFnbS5tY21jLmFsbG9jYXRpb24iLA0KICAgICAgICBjZXggPSBmRGF0YShhcmFiaWRwb3Npc19jbzNyZXA0KSR0YWdtLm1jbWMubWVhbi5zaGFubm9uLA0KICAgICAgICBtYWluID0gIlZpc3VhbGlzaW5nIGdsb2JhbCB1bmNlcnRhaW50eSIpDQphZGRMZWdlbmQoYXJhYmlkcG9zaXNfY28zcmVwNCwgZmNvbCA9ICJtYXJrZXJzMiIsDQogICAgICAgICAgIHdoZXJlID0gInRvcGxlZnQiLCBuY29sID0gMiwgY2V4ID0gMC42KQ0KDQpgYGANCg0KYGBge3IsfQ0Kc2F2ZShhcmFiX2NvM3JlcDRfbWFya2VyczJfcGFyYW1zX3Bvb2xlZCwgZmlsZSA9ICJhcmFiX2NvM3JlcDRfbWFya2VyczJfcGFyYW1zX3Bvb2xlZC5yZGEiKQ0Kc2F2ZShhcmFiaWRwb3Npc19jbzNyZXA0LCBmaWxlID0gImFyYWJpZHBvc2lzX2NvM3JlcDRfbWFya2VyczJfdGFnbS5yZGEiKQ0KYGBgDQoNCg0KIyBDbzMgY29tYmluZWQgcmVwcyANCg0KYGBge3IsfQ0KbG9hZCgiQzovVXNlcnMvT2xseUMvRGVza3RvcC8yMDE5LUxPUElULVByb2plY3RzLzIwMjAtSGFycmlldC1BcmFiaWRvcHNpcy0vUmF3RGF0YS9hcmFiaWRwb3Npc19jbzNyZXA0LnJkYSIpDQphcmFiX2NvM3JlcDRfcGFyYW1zIDwtIHJlYWRSRFMoZmlsZSA9ICJDOi9Vc2Vycy9PbGx5Qy9EZXNrdG9wLzIwMTktTE9QSVQtUHJvamVjdHMvMjAyMC1IYXJyaWV0LUFyYWJpZG9wc2lzLS9SYXdEYXRhL21jbWNfYXJhYmlkcG9zaXNfY28zcmVwNC5yZHMiKQ0KYGBgDQoNCiNpbnRpYWwgdmlzdWFsaXNhdGlvbg0KYGBge3IsfQ0KZkRhdGEoYXJhYmlkcG9zaXNfY28zcmVwNCkkbWFya2Vyc1tmRGF0YShhcmFiaWRwb3Npc19jbzNyZXA0KSRtYXJrZXJzICVpbiUgYygiY3l0b3NvbGljIHJpYm9zb21lcyIsICJleHRyYWNlbGx1bGFyIildIDwtICJ1bmtub3duIg0KcGxvdDJEKGFyYWJpZHBvc2lzX2NvM3JlcDQsIGdyaWQgPSBGQUxTRSwgZmNvbCA9ICJtYXJrZXJzIikNCmFkZExlZ2VuZChhcmFiaWRwb3Npc19jbzNyZXA0LCB3aGVyZSA9ICJ0b3BsZWZ0IiwgY2V4ID0gMC43LCBuY29sID0gMiwgZmNvbCA9ICJtYXJrZXJzIikNCmBgYA0KYGBge3IsfQ0Kb3V0IDwtIG1jbWNfZ2V0X291dGxpZXJzKGFyYWJfY28zcmVwNF9wYXJhbXMpDQoNCmBgYA0KDQoNCmBgYHtyLH0NCm5DaGFpbnMgPC0gbGVuZ3RoKGFyYWJfY28zcmVwNF9wYXJhbXMpDQpuQ2hhaW5zDQpmb3IgKGkgaW4gc2VxX2xlbihuQ2hhaW5zKSkNCiAgICBwbG90KG91dFtbaV1dLCBtYWluID0gcGFzdGUoIkNoYWluIiwgaSksIGF1dG8ubGF5b3V0ID0gRkFMU0UsIGNvbCA9IGkpDQoNCmBgYA0KYGBge3IsfQ0KZ2VsbWFuLmRpYWcob3V0W2MoMSwyKV0sIHRyYW5zZm9ybSA9IEZBTFNFKQ0KDQpgYGANCmBgYHtyLH0NCmFyYWJfY28zcmVwNF9wYXJhbXNfcG9vbGVkIDwtIG1jbWNfcG9vbF9jaGFpbnMoYXJhYl9jbzNyZXA0X3BhcmFtc1tjKDEsMildKQ0KYXJhYl9jbzNyZXA0X3BhcmFtc19wb29sZWQNCg0KYGBgDQoNCg0KYGBge3IsfQ0KYXJhYl9jbzNyZXA0X3BhcmFtc19wb29sZWQgPC0gdGFnbU1jbWNQcm9jZXNzKGFyYWJfY28zcmVwNF9wYXJhbXNfcG9vbGVkKQ0KYXJhYl9jbzNyZXA0X3BhcmFtc19wb29sZWQNCg0KYGBgDQoNCg0KYGBge3IsfQ0KYXJhYmlkcG9zaXNfY28zcmVwNCA8LSB0YWdtUHJlZGljdChvYmplY3QgPSBhcmFiaWRwb3Npc19jbzNyZXA0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gYXJhYl9jbzNyZXA0X3BhcmFtc19wb29sZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iSm9pbnQgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNvbCA9ICJtYXJrZXJzIikNCmhlYWQoZkRhdGEoYXJhYmlkcG9zaXNfY28zcmVwNCkpDQoNCmBgYA0KDQpgYGB7cix9DQpwYXIobWZyb3cgPSBjKDEsIDIpKQ0KcGxvdDJEKGFyYWJpZHBvc2lzX2NvM3JlcDQsIGZjb2wgPSAidGFnbS5tY21jLmFsbG9jYXRpb24iLA0KICAgICAgICBjZXggPSBmRGF0YShhcmFiaWRwb3Npc19jbzNyZXA0KSR0YWdtLm1jbWMucHJvYmFiaWxpdHksDQogICAgICAgIG1haW4gPSAiVEFHTSBNQ01DIGFsbG9jYXRpb25zIikNCmFkZExlZ2VuZChhcmFiaWRwb3Npc19jbzNyZXA0LCBmY29sID0gIm1hcmtlcnMiLA0KICAgICAgICAgICB3aGVyZSA9ICJ0b3BsZWZ0IiwgbmNvbCA9IDIsIGNleCA9IDAuNikNCg0KcGxvdDJEKGFyYWJpZHBvc2lzX2NvM3JlcDQsIGZjb2wgPSAidGFnbS5tY21jLmFsbG9jYXRpb24iLA0KICAgICAgICBjZXggPSBmRGF0YShhcmFiaWRwb3Npc19jbzNyZXA0KSR0YWdtLm1jbWMubWVhbi5zaGFubm9uLA0KICAgICAgICBtYWluID0gIlZpc3VhbGlzaW5nIGdsb2JhbCB1bmNlcnRhaW50eSIpDQphZGRMZWdlbmQoYXJhYmlkcG9zaXNfY28zcmVwNCwgZmNvbCA9ICJtYXJrZXJzIiwNCiAgICAgICAgICAgd2hlcmUgPSAidG9wbGVmdCIsIG5jb2wgPSAyLCBjZXggPSAwLjYpDQoNCmBgYA0KDQpgYGB7cix9DQpzYXZlKCBhcmFiX2NvM3JlcDRfcGFyYW1zX3Bvb2xlZCwgZmlsZSA9ICIgYXJhYl9jbzNyZXA0X3BhcmFtc19wb29sZWQucmRhIikNCnNhdmUoYXJhYmlkcG9zaXNfY28zcmVwNCwgZmlsZSA9ICJhcmFiaWRwb3Npc19jbzNyZXA0X3RhZ20ucmRhIikNCmBgYA0KDQoNCiMgQ28zIGNvbWJpbmVkDQoNCmBgYHtyLH0NCmxvYWQoIkM6L1VzZXJzL09sbHlDL0Rlc2t0b3AvMjAxOS1MT1BJVC1Qcm9qZWN0cy8yMDIwLUhhcnJpZXQtQXJhYmlkb3BzaXMtL1Jhd0RhdGEvYXJhYmlkcG9zaXNfY28zLnJkYSIpDQphcmFiX2NvM19wYXJhbXMgPC0gcmVhZFJEUyhmaWxlID0gIkM6L1VzZXJzL09sbHlDL0Rlc2t0b3AvMjAxOS1MT1BJVC1Qcm9qZWN0cy8yMDIwLUhhcnJpZXQtQXJhYmlkb3BzaXMtL1Jhd0RhdGEvbWNtY19hcmFiaWRwb3Npc19jbzMucmRzIikNCmBgYA0KDQojaW50aWFsIHZpc3VhbGlzYXRpb24NCmBgYHtyLH0NCmZEYXRhKGFyYWJpZHBvc2lzX2NvMykkbWFya2Vyc1tmRGF0YShhcmFiaWRwb3Npc19jbzMpJG1hcmtlcnMgJWluJSBjKCJjeXRvc29saWMgcmlib3NvbWVzIiwgImV4dHJhY2VsbHVsYXIiKV0gPC0gInVua25vd24iDQpwbG90MkQoYXJhYmlkcG9zaXNfY28zLCBncmlkID0gRkFMU0UsIGZjb2wgPSAibWFya2VycyIpDQphZGRMZWdlbmQoYXJhYmlkcG9zaXNfY28zLCB3aGVyZSA9ICJ0b3BsZWZ0IiwgY2V4ID0gMC43LCBuY29sID0gMiwgZmNvbCA9ICJtYXJrZXJzIikNCmBgYA0KYGBge3IsfQ0Kb3V0IDwtIG1jbWNfZ2V0X291dGxpZXJzKGFyYWJfY28zX3BhcmFtcykNCg0KYGBgDQoNCg0KYGBge3IsfQ0KbkNoYWlucyA8LSBsZW5ndGgoYXJhYl9jbzNfcGFyYW1zKQ0KbkNoYWlucw0KZm9yIChpIGluIHNlcV9sZW4obkNoYWlucykpDQogICAgcGxvdChvdXRbW2ldXSwgbWFpbiA9IHBhc3RlKCJDaGFpbiIsIGkpLCBhdXRvLmxheW91dCA9IEZBTFNFLCBjb2wgPSBpKQ0KDQpgYGANCmBgYHtyLH0NCmdlbG1hbi5kaWFnKG91dFtjKDEsMiwzLDQpXSwgdHJhbnNmb3JtID0gRkFMU0UpDQoNCmBgYA0KYGBge3IsfQ0KYXJhYl9jbzNfcGFyYW1zX3Bvb2xlZCA8LSBtY21jX3Bvb2xfY2hhaW5zKGFyYWJfY28zX3BhcmFtc1tjKDEsMiwzLDQpXSkNCmFyYWJfY28zX3BhcmFtc19wb29sZWQNCg0KYGBgDQoNCg0KYGBge3IsfQ0KYXJhYl9jbzNfcGFyYW1zX3Bvb2xlZCA8LSB0YWdtTWNtY1Byb2Nlc3MoYXJhYl9jbzNfcGFyYW1zX3Bvb2xlZCkNCmFyYWJfY28zX3BhcmFtc19wb29sZWQNCg0KYGBgDQoNCg0KYGBge3IsfQ0KYXJhYmlkcG9zaXNfY28zIDwtIHRhZ21QcmVkaWN0KG9iamVjdCA9IGFyYWJpZHBvc2lzX2NvMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IGFyYWJfY28zX3BhcmFtc19wb29sZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iSm9pbnQgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNvbCA9ICJtYXJrZXJzIikNCmhlYWQoZkRhdGEoYXJhYmlkcG9zaXNfY28zKSkNCg0KYGBgDQoNCmBgYHtyLH0NCnBhcihtZnJvdyA9IGMoMSwgMikpDQpwbG90MkQoYXJhYmlkcG9zaXNfY28zLCBmY29sID0gInRhZ20ubWNtYy5hbGxvY2F0aW9uIiwNCiAgICAgICAgY2V4ID0gZkRhdGEoYXJhYmlkcG9zaXNfY28zKSR0YWdtLm1jbWMucHJvYmFiaWxpdHksDQogICAgICAgIG1haW4gPSAiVEFHTSBNQ01DIGFsbG9jYXRpb25zIikNCmFkZExlZ2VuZChhcmFiaWRwb3Npc19jbzMsIGZjb2wgPSAibWFya2VycyIsDQogICAgICAgICAgIHdoZXJlID0gInRvcGxlZnQiLCBuY29sID0gMiwgY2V4ID0gMC42KQ0KDQpwbG90MkQoYXJhYmlkcG9zaXNfY28zLCBmY29sID0gInRhZ20ubWNtYy5hbGxvY2F0aW9uIiwNCiAgICAgICAgY2V4ID0gZkRhdGEoYXJhYmlkcG9zaXNfY28zKSR0YWdtLm1jbWMubWVhbi5zaGFubm9uLA0KICAgICAgICBtYWluID0gIlZpc3VhbGlzaW5nIGdsb2JhbCB1bmNlcnRhaW50eSIpDQphZGRMZWdlbmQoYXJhYmlkcG9zaXNfY28zLCBmY29sID0gIm1hcmtlcnMiLA0KICAgICAgICAgICB3aGVyZSA9ICJ0b3BsZWZ0IiwgbmNvbCA9IDIsIGNleCA9IDAuNikNCg0KYGBgDQoNCmBgYHtyLH0NCnNhdmUoYXJhYl9jbzNfcGFyYW1zX3Bvb2xlZCwgZmlsZSA9ICJhcmFiX2NvM19wYXJhbXNfcG9vbGVkLnJkYSIpDQpzYXZlKGFyYWJpZHBvc2lzX2NvMywgZmlsZSA9ICJhcmFiaWRwb3Npc19jbzNfdGFnbS5yZGEiKQ0KYGBgDQoNCiNjbzMgcmVwNCBtYXJrZXJzIDINCg0KDQpgYGB7cix9DQpsb2FkKCJDOi9Vc2Vycy9PbGx5Qy9EZXNrdG9wLzIwMTktTE9QSVQtUHJvamVjdHMvMjAyMC1IYXJyaWV0LUFyYWJpZG9wc2lzLS9SYXdEYXRhL2FyYWJpZHBvc2lzX2NvM3JlcDQucmRhIikNCmFyYWJfY28zcmVwNF9tYXJrZXJzMl9wYXJhbXMgPC0gcmVhZFJEUyhmaWxlID0gIkM6L1VzZXJzL09sbHlDL0Rlc2t0b3AvMjAxOS1MT1BJVC1Qcm9qZWN0cy8yMDIwLUhhcnJpZXQtQXJhYmlkb3BzaXMtL1Jhd0RhdGEvbWNtY19hcmFiaWRwb3Npc19jbzNyZXA0X21hcmtlcnMyLnJkcyIpDQpgYGANCg0KI2ludGlhbCB2aXN1YWxpc2F0aW9uDQpgYGB7cix9DQpmRGF0YShhcmFiaWRwb3Npc19jbzNyZXA0KSRtYXJrZXJzMltmRGF0YShhcmFiaWRwb3Npc19jbzNyZXA0KSRtYXJrZXJzMiAlaW4lIGMoImN5dG9zb2xpYyByaWJvc29tZXMiLCAiZXh0cmFjZWxsdWxhciIpXSA8LSAidW5rbm93biINCnBsb3QyRChhcmFiaWRwb3Npc19jbzNyZXA0LCBncmlkID0gRkFMU0UsIGZjb2wgPSAibWFya2VycyIpDQphZGRMZWdlbmQoYXJhYmlkcG9zaXNfY28zLCB3aGVyZSA9ICJ0b3BsZWZ0IiwgY2V4ID0gMC43LCBuY29sID0gMiwgZmNvbCA9ICJtYXJrZXJzMiIpDQpgYGANCmBgYHtyLH0NCm91dCA8LSBtY21jX2dldF9vdXRsaWVycyhhcmFiX2NvM3JlcDRfbWFya2VyczJfcGFyYW1zKQ0KDQpgYGANCg0KDQpgYGB7cix9DQpuQ2hhaW5zIDwtIGxlbmd0aChhcmFiX2NvM3JlcDRfbWFya2VyczJfcGFyYW1zKQ0KbkNoYWlucw0KZm9yIChpIGluIHNlcV9sZW4obkNoYWlucykpDQogICAgcGxvdChvdXRbW2ldXSwgbWFpbiA9IHBhc3RlKCJDaGFpbiIsIGkpLCBhdXRvLmxheW91dCA9IEZBTFNFLCBjb2wgPSBpKQ0KDQpgYGANCmBgYHtyLH0NCmdlbG1hbi5kaWFnKG91dFtjKDEsMiwzLDQpXSwgdHJhbnNmb3JtID0gRkFMU0UpDQoNCmBgYA0KYGBge3IsfQ0KYXJhYl9jbzNyZXA0X21hcmtlcnMyX3BhcmFtc19wb29sZWQgPC0gbWNtY19wb29sX2NoYWlucyhhcmFiX2NvM3JlcDRfbWFya2VyczJfcGFyYW1zW2MoMSwyLDMsNCldKQ0KYXJhYl9jbzNyZXA0X21hcmtlcnMyX3BhcmFtc19wb29sZWQNCg0KYGBgDQoNCg0KYGBge3IsfQ0KYXJhYl9jbzNyZXA0X21hcmtlcnMyX3BhcmFtc19wb29sZWQgIDwtIHRhZ21NY21jUHJvY2VzcyhhcmFiX2NvM3JlcDRfbWFya2VyczJfcGFyYW1zX3Bvb2xlZCApDQphcmFiX2NvM3JlcDRfbWFya2VyczJfcGFyYW1zX3Bvb2xlZCANCg0KYGBgDQoNCg0KYGBge3IsfQ0KYXJhYmlkcG9zaXNfY28zcmVwNCA8LSB0YWdtUHJlZGljdChvYmplY3QgPSBhcmFiaWRwb3Npc19jbzNyZXA0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gYXJhYl9jbzNyZXA0X21hcmtlcnMyX3BhcmFtc19wb29sZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iSm9pbnQgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNvbCA9ICJtYXJrZXJzMiIpDQpoZWFkKGZEYXRhKGFyYWJpZHBvc2lzX2NvM3JlcDQpKQ0KDQpgYGANCg0KYGBge3IsfQ0KcGFyKG1mcm93ID0gYygxLCAyKSkNCnBsb3QyRChhcmFiaWRwb3Npc19jbzNyZXA0LCBmY29sID0gInRhZ20ubWNtYy5hbGxvY2F0aW9uIiwNCiAgICAgICAgY2V4ID0gZkRhdGEoYXJhYmlkcG9zaXNfY28zcmVwNCkkdGFnbS5tY21jLnByb2JhYmlsaXR5LA0KICAgICAgICBtYWluID0gIlRBR00gTUNNQyBhbGxvY2F0aW9ucyIpDQphZGRMZWdlbmQoYXJhYmlkcG9zaXNfY28zLCBmY29sID0gIm1hcmtlcnMyIiwNCiAgICAgICAgICAgd2hlcmUgPSAidG9wbGVmdCIsIG5jb2wgPSAyLCBjZXggPSAwLjYpDQoNCnBsb3QyRChhcmFiaWRwb3Npc19jbzNyZXA0LCBmY29sID0gInRhZ20ubWNtYy5hbGxvY2F0aW9uIiwNCiAgICAgICAgY2V4ID0gZkRhdGEoYXJhYmlkcG9zaXNfY28zcmVwNCkkdGFnbS5tY21jLm1lYW4uc2hhbm5vbiwNCiAgICAgICAgbWFpbiA9ICJWaXN1YWxpc2luZyBnbG9iYWwgdW5jZXJ0YWludHkiKQ0KYWRkTGVnZW5kKGFyYWJpZHBvc2lzX2NvM3JlcDQsIGZjb2wgPSAibWFya2VyczIiLA0KICAgICAgICAgICB3aGVyZSA9ICJ0b3BsZWZ0IiwgbmNvbCA9IDIsIGNleCA9IDAuNikNCg0KYGBgDQoNCmBgYHtyLH0NCnNhdmUoYXJhYl9jbzNyZXA0X21hcmtlcnMyX3BhcmFtc19wb29sZWQsIGZpbGUgPSAiYXJhYl9jbzNyZXA0X21hcmtlcnMyX3BhcmFtc19wb29sZWQucmRhIikNCnNhdmUoYXJhYmlkcG9zaXNfY28zcmVwNCwgZmlsZSA9ICJhcmFiaWRwb3Npc19jbzNyZXBfbWFya2VyczJfdGFnbS5yZGEiKQ0KYGBgDQoNCg0KIyBjbzMgY29tYmluZWQgbWFya2VycyAyDQoNCmBgYHtyLH0NCmxvYWQoIkM6L1VzZXJzL09sbHlDL0Rlc2t0b3AvMjAxOS1MT1BJVC1Qcm9qZWN0cy8yMDIwLUhhcnJpZXQtQXJhYmlkb3BzaXMtL1Jhd0RhdGEvYXJhYmlkcG9zaXNfY28zLnJkYSIpDQphcmFiX2NvM19tYXJrZXJzMl9wYXJhbXMgPC0gcmVhZFJEUyhmaWxlID0gIkM6L1VzZXJzL09sbHlDL0Rlc2t0b3AvMjAxOS1MT1BJVC1Qcm9qZWN0cy8yMDIwLUhhcnJpZXQtQXJhYmlkb3BzaXMtL1Jhd0RhdGEvbWNtY19hcmFiaWRwb3Npc19jbzNfbWFya2VyczIucmRzIikNCmBgYA0KDQojaW50aWFsIHZpc3VhbGlzYXRpb24NCmBgYHtyLH0NCmZEYXRhKGFyYWJpZHBvc2lzX2NvMykkbWFya2VyczJbZkRhdGEoYXJhYmlkcG9zaXNfY28zKSRtYXJrZXJzMiAlaW4lIGMoImN5dG9zb2xpYyByaWJvc29tZXMiLCAiZXh0cmFjZWxsdWxhciIpXSA8LSAidW5rbm93biINCnBsb3QyRChhcmFiaWRwb3Npc19jbzMsIGdyaWQgPSBGQUxTRSwgZmNvbCA9ICJtYXJrZXJzMiIpDQphZGRMZWdlbmQoYXJhYmlkcG9zaXNfY28zLCB3aGVyZSA9ICJ0b3BsZWZ0IiwgY2V4ID0gMC43LCBuY29sID0gMiwgZmNvbCA9ICJtYXJrZXJzMiIpDQpgYGANCmBgYHtyLH0NCm91dCA8LSBtY21jX2dldF9vdXRsaWVycyhhcmFiX2NvM19tYXJrZXJzMl9wYXJhbXMpDQoNCmBgYA0KDQoNCmBgYHtyLH0NCm5DaGFpbnMgPC0gbGVuZ3RoKGFyYWJfY28zX21hcmtlcnMyX3BhcmFtcykNCm5DaGFpbnMNCmZvciAoaSBpbiBzZXFfbGVuKG5DaGFpbnMpKQ0KICAgIHBsb3Qob3V0W1tpXV0sIG1haW4gPSBwYXN0ZSgiQ2hhaW4iLCBpKSwgYXV0by5sYXlvdXQgPSBGQUxTRSwgY29sID0gaSkNCg0KYGBgDQpgYGB7cix9DQpnZWxtYW4uZGlhZyhvdXRbYygxLDIsMyw0KV0sIHRyYW5zZm9ybSA9IEZBTFNFKQ0KDQpgYGANCmBgYHtyLH0NCmFyYWJfY28zX21hcmtlcnMyX3BhcmFtc19wb29sZWQgPC0gbWNtY19wb29sX2NoYWlucyhhcmFiX2NvM19tYXJrZXJzMl9wYXJhbXNbYygxLDIsMyw0KV0pDQphcmFiX2NvM19tYXJrZXJzMl9wYXJhbXNfcG9vbGVkDQoNCmBgYA0KDQoNCmBgYHtyLH0NCmFyYWJfY28zX21hcmtlcnMyX3BhcmFtc19wb29sZWQgPC0gdGFnbU1jbWNQcm9jZXNzKGFyYWJfY28zX21hcmtlcnMyX3BhcmFtc19wb29sZWQpDQphcmFiX2NvM19tYXJrZXJzMl9wYXJhbXNfcG9vbGVkDQoNCmBgYA0KDQoNCmBgYHtyLH0NCmFyYWJpZHBvc2lzX2NvMyA8LSB0YWdtUHJlZGljdChvYmplY3QgPSBhcmFiaWRwb3Npc19jbzMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSBhcmFiX2NvM19tYXJrZXJzMl9wYXJhbXNfcG9vbGVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYkpvaW50ID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZjb2wgPSAibWFya2VyczIiKQ0KaGVhZChmRGF0YShhcmFiaWRwb3Npc19jbzMpKQ0KDQpgYGANCg0KYGBge3IsfQ0KcGFyKG1mcm93ID0gYygxLCAyKSkNCnBsb3QyRChhcmFiaWRwb3Npc19jbzMsIGZjb2wgPSAidGFnbS5tY21jLmFsbG9jYXRpb24iLA0KICAgICAgICBjZXggPSBmRGF0YShhcmFiaWRwb3Npc19jbzMpJHRhZ20ubWNtYy5wcm9iYWJpbGl0eSwNCiAgICAgICAgbWFpbiA9ICJUQUdNIE1DTUMgYWxsb2NhdGlvbnMiKQ0KYWRkTGVnZW5kKGFyYWJpZHBvc2lzX2NvMywgZmNvbCA9ICJtYXJrZXJzMiIsDQogICAgICAgICAgIHdoZXJlID0gInRvcGxlZnQiLCBuY29sID0gMiwgY2V4ID0gMC42KQ0KDQpwbG90MkQoYXJhYmlkcG9zaXNfY28zLCBmY29sID0gInRhZ20ubWNtYy5hbGxvY2F0aW9uIiwNCiAgICAgICAgY2V4ID0gZkRhdGEoYXJhYmlkcG9zaXNfY28zKSR0YWdtLm1jbWMubWVhbi5zaGFubm9uLA0KICAgICAgICBtYWluID0gIlZpc3VhbGlzaW5nIGdsb2JhbCB1bmNlcnRhaW50eSIpDQphZGRMZWdlbmQoYXJhYmlkcG9zaXNfY28zLCBmY29sID0gIm1hcmtlcnMyIiwNCiAgICAgICAgICAgd2hlcmUgPSAidG9wbGVmdCIsIG5jb2wgPSAyLCBjZXggPSAwLjYpDQoNCmBgYA0KDQpgYGB7cix9DQpzYXZlKGFyYWJfY28zX21hcmtlcnMyX3BhcmFtc19wb29sZWQsIGZpbGUgPSAiYXJhYl9jbzNfbWFya2VyczJfcGFyYW1zX3Bvb2xlZC5yZGEiKQ0Kc2F2ZShhcmFiaWRwb3Npc19jbzMsIGZpbGUgPSAiYXJhYmlkcG9zaXNfY28zX21hcmtlcnMyX3RhZ20ucmRhIikNCmBgYA0K